Python关闭tcp连接

时间:2013-09-01 10:00:46

标签: python multithreading sockets tcp

我有一个python tcp服务器,每个连接都有监听的线程。 当我在连接对象异常上调用close时,抛出了“坏文件描述符”。 通过谷歌搜索,我发现了一些解决方案,每个解决方案都使用循环来接收客户端数据并打破该循环,当他们决定断开客户端时。我的客户端是用C#编写的,并没有“获取”,它与服务器“断开连接”,python只是忽略来自C#客户端的数据。 在python中断开tcp连接与服务器端的合法,最佳实践方法是什么?

提前致谢

2 个答案:

答案 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.htmlhttp://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端)。