【发布时间】:2017-10-29 00:04:30
【问题描述】:
我有一个 Python 3 服务器脚本,它运行 TCP 套接字服务器,使用 select.select() 检测和响应传入数据
我使用 select.select() 来处理没有线程的多个连接,并且服务器主要是反应式的(只等待数据并对其做出响应)。它为另一端设备的每个连接和参数保留一个字典;每个设备的条目都会在其连接关闭时被删除。
我的问题是我的客户端有时会在没有实际关闭 TCP 套接字的情况下失去连接,我不知道如何捕获或创建超时以关闭套接字并从字典中删除旧连接。
有什么好办法吗?
这是脚本的简化副本:
host = '192.168.0.252'
port = 9989
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((host,port))
server.listen(16)
socks = [server]
devices = {}
while True:
readable,writable,exceptionavailable = select.select(socks,[],[])
for s in readable:
if(s == server):
client, address = server.accept()
socks.append(client)
else:
try: data = s.recv(1024)
except ConnectionResetError: data = 0
if data:
print(data) # Would append device to "devices" dictionary
else:
s.close()
socks.remove(s)
del(devices[did]) # did is the ID that needs deleting from dictionary
任何帮助将不胜感激。
【问题讨论】:
-
我建议查看
SO_KEEPALIVE选项和相关选项。在套接字上使用这些选项将允许使用保持活动探针来检查连接是否在没有警告的情况下关闭。
标签: python sockets python-3.x tcp