我如何处理可读但不接收任何内容的套接字?
how do I handle sockets which is readable but recv nothing?
最近我在 python 上使用套接字编写了一个 http/https 代理,我使用 select 来决定套接字是否准备好接收或发送,像这样:
inputs = [sock1, sock2...]
outputs = [sock1, sock2...]
while True:
readable, writable, exceptional = select.select(inputs, outputs, inputs)
for s in readable:
do something with s.recv()
for s in writable:
do something with s.send()
并且我注意到有时套接字是可读的,但是当我执行 s.recv() 时它 returns 是空的。而且因为我在外面有一个 while True 循环,所以它一次又一次地什么也得不到。我首先尝试关闭套接字:
data = s.recv(4096)
if not data:
inputs.remove(s)
s.close()
但过了一会儿,一些套接字激活了,它们无法向我发送消息,因为我已经关闭了它。
这是否意味着我不应该关闭它?那我该怎么办呢?
当接收列表中的套接字returns recv
上的零字节时,表示套接字已从另一端关闭。它永远不会再接收数据,也应该关闭并在您这边关闭。
你这样 "some socket comes alive" - 它不是此连接另一端的套接字,那个套接字已经关闭了。
最近我在 python 上使用套接字编写了一个 http/https 代理,我使用 select 来决定套接字是否准备好接收或发送,像这样:
inputs = [sock1, sock2...]
outputs = [sock1, sock2...]
while True:
readable, writable, exceptional = select.select(inputs, outputs, inputs)
for s in readable:
do something with s.recv()
for s in writable:
do something with s.send()
并且我注意到有时套接字是可读的,但是当我执行 s.recv() 时它 returns 是空的。而且因为我在外面有一个 while True 循环,所以它一次又一次地什么也得不到。我首先尝试关闭套接字:
data = s.recv(4096)
if not data:
inputs.remove(s)
s.close()
但过了一会儿,一些套接字激活了,它们无法向我发送消息,因为我已经关闭了它。 这是否意味着我不应该关闭它?那我该怎么办呢?
当接收列表中的套接字returns recv
上的零字节时,表示套接字已从另一端关闭。它永远不会再接收数据,也应该关闭并在您这边关闭。
你这样 "some socket comes alive" - 它不是此连接另一端的套接字,那个套接字已经关闭了。