2017-04-03 1 views
0

소켓 프로그래밍에 종사하고 있으며 서버에 참여하는 모든 클라이언트의 트랙을 유지해야합니다.클라이언트가 소켓에서 서버의 연결을 끊는 지 확인하는 방법

client = [] 

을하고 서버에 연결할 때마다 클라이언트를 추가 :

그래서 난 그냥 그들에게 목록을 유지하고있다. 이제 클라이언트 연결이 끊어 질 때마다 목록에서 클라이언트를 제거해야합니다. 문제는 클라이언트가 서버와의 연결을 끊었을 때 어떻게 알 수 있습니까?

서버를 연결하는 경우, 내가 사용하고

:

s = socket.socket() 
s.bind((host, port)) 
client = [] 
while True: 
    c, addr = s.accept() 
    client.append(addr) 
s.close() 
+0

이 허용 소켓을 사용하면 기록 할 때, 오류가 발생하는 것, 또는 피어는 sockect 폐쇄되는 즉시 읽을 때 0 바이트 읽기. –

+0

_Ux_에서 (일반) 소켓은 파일 설명자이므로 ['fcntl (fd, F_GETFD)]] (http://man7.org/linux/man-pages/man2/fcntl.2.html)을 사용할 수 있습니다. – CristiFati

답변

0

일반적으로, 소켓이 연결되어 있지, 그것을 기록하는 경우 socket.error을 제기하고, 또한에서 읽을 때 b""를 반환합니다.

당신이 할 수있는 일은, 당신이 그 예외를 잡아서 쓰는 경우 클라이언트를 제거하고, 읽는다면 데이터가 비어 있는지 확인하는 것입니다.

Btw, 소켓을 클라이언트가 아닌 addr으로 사용해야합니다. 이처럼

:

try: 
    sock.send(data) 
except socket.error: 
    client.remove(sock) 

data = sock.receive(1024) 
if not data: 
    sock.close() 
    client.remove(sock) 
관련 문제