1 回答
TA贡献1862条经验 获得超6个赞
不幸的是,这是操作系统界面的限制。在已知套接字已断开连接后,二进制 (C) 程序也将无法获得对等名称。这是一种不幸的疣。您不能将套接字重新用于新连接,因此我没有充分的理由想出为什么无法检索对等名称的原因,但是......它不能。
第一个想法是使用单独dict的套接字对象作为键,通过它您可以查找关联的客户端地址:
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]))
其次是创建一个单独的类来包装套接字。该类可以保存您从中获得的对等地址,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)
添加回答
举报