我有一个python tcp服务器,每个连接都有监听的线程。
当我在连接对象异常上调用close
时,抛出了“坏文件描述符”。
通过谷歌搜索,我发现了一些解决方案,每个解决方案都使用循环来接收客户端数据并打破该循环,当他们决定断开客户端时。我的客户端是用C#编写的,并没有“获取”,它与服务器“断开连接”,python只是忽略来自C#客户端的数据。
在python中断开tcp连接与服务器端的合法,最佳实践方法是什么?
提前致谢
答案 0 :(得分:2)
错误的文件描述符很可能意味着套接字已被另一个线程关闭。
以下是一般做法的一些想法。对于客户端,一种知道它是断开连接的方法是检查recv()值是否为0.如果是,则表示远程端已关闭连接。基本上,您应该使用select(或poll)并传递所有客户端和服务器的fds以进行选择。如果你在任何一个fds上得到一个读事件,那么根据fd类型,这里会发生什么。如果fd是服务器类型,则读取事件意味着存在挂起连接,您应该发出accept()以获取新连接。另一方面,如果hte fd是非服务器类型(意味着常规tcp连接),则读取事件意味着存在一些数据,您应该发出recv()事件来读取数据。
您可以使用循环进行选择。基本上,使用select()调用启动循环,一旦获得事件,请对该事件执行某些操作,然后重新进入循环并发出下一个select()。 您可能会发现这些链接很有用:http://ilab.cs.byu.edu/python/select/echoserver.html和http://docs.python.org/2/library/socket.html
答案 1 :(得分:1)
来自the docs:
注意:close()会释放与连接关联的资源 不一定立即关闭连接。如果你想 及时关闭连接,之前调用shutdown() 关闭()。
因此,您应在致电shutdown()
之前致电close()
。您还应该传递SHUT_RDWR
标志以完全关闭连接:
from socket import SHUT_RDWR
...
try:
s.shutdown(SHUT_RDWR)
s.close()
except Exception:
pass
“错误的文件描述”错误意味着(很可能)套接字已经关闭(至少从Python端)。