1 回答

TA貢獻1862條經(jīng)驗 獲得超6個贊
不幸的是,這是操作系統(tǒng)界面的限制。在已知套接字已斷開連接后,二進制 (C) 程序也將無法獲得對等名稱。這是一種不幸的疣。您不能將套接字重新用于新連接,因此我沒有充分的理由想出為什么無法檢索對等名稱的原因,但是......它不能。
第一個想法是使用單獨dict的套接字對象作為鍵,通過它您可以查找關(guān)聯(lián)的客戶端地址:
saved_addr = {}
...
connection, client_address = server.accept()
saved_addr[connection] = client_address`
while True:
try:
data = connection.recv(1024)
except socket.error:
print("{} disconnected".format(saved_addr[connection]))
其次是創(chuàng)建一個單獨的類來包裝套接字。該類可以保存您從中獲得的對等地址,accept并在需要時將其返回給您。同時,它可以透明地將所有其他操作委托給底層套接字。
示范:
import socket
import time
class ConnectedSocket:
def __init__(self, sock, peer):
self.sock = sock
self.peer = peer
def get_peer(self):
return self.peer
def __getattr__(self, name):
return getattr(self.sock, name)
def run_server(port):
server = socket.socket()
server.bind(('', port))
server.listen(5)
while True:
csock, addr = server.accept()
csock = ConnectedSocket(csock, addr)
print("Accepted from {}".format(addr))
while True:
time.sleep(.5)
try:
csock.send(b'Hello')
except socket.error as err:
print("Error {} sending to peer {}".format(err, csock.get_peer()))
csock.close()
break
run_server(9999)
添加回答
舉報