2017-04-03 104 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

On _Ux_因爲(普通)套接字是文件描述符,所以可以使用['fcntl(fd,F_GETFD)'](http://man7.org/linux/man-pages/man2/fcntl.2.html)。 – CristiFati

回答

0

通常,當插座斷開,它提出如果寫入socket.error,也從讀時返回b""

所以你可以做的是,你可以捕捉到這個異常,如果寫入時刪除客戶端,並且在讀取數據時檢查數據是否爲空。

順便說一句,你需要使用套接字作爲客戶端,而不是它的地址。

像這樣:

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

data = sock.receive(1024) 
if not data: 
    sock.close() 
    client.remove(sock) 
相關問題