2013-09-01 204 views
4

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

在此先感谢

+0

//,优秀的问题!我其实对此很感兴趣。 (http://superuser.com/questions/127863/manually-closing-a-port-from-commandline/946641?noredirect=1#comment1429085_946641)你介意显示一个或两个“循环“解决方案,你在搜索引擎上找到? –

回答

2

一个坏的文件描述符,最有可能的,意味着该插座已经被另一个线程关闭。

以下是关于一般实践的一些想法。对于客户端来说,知道它断开连接的一种方法是检查recv()值是否为0.如果是,则表示远程端已关闭连接。基本上,您应该使用select(或poll)并将所有客户端和服务器的fds传递给select。如果你在任何一个fds上都有读取事件,那么根据fd类型,这里会发生什么。如果fd是服务器类型,那么读取事件意味着存在未决连接,您应该发出accept()来获取新连接。另一方面,如果hte fd是非服务器类型(意思是一个常规的tcp连接),那么read事件意味着有一些数据,你应该发出一个recv()事件来读取数据。

您将使用循环选择。基本上,使用select()调用启动循环,一旦你得到一个事件,就对该事件做一些事情,然后重新进入循环并发出下一个select()。 您可能会发现这些链接有帮助的:http://ilab.cs.byu.edu/python/select/echoserver.htmlhttp://docs.python.org/2/library/socket.html

1

the docs

注:关闭()释放与连接相关联的资源,但 并不一定立即关闭连接。如果您想要 及时关闭连接,请在 close()之前调用shutdown()。

所以你应该在致电close()之前致电shutdown()。你还应该通过SHUT_RDWR标志完全关闭连接:

from socket import SHUT_RDWR 
... 
try: 
    s.shutdown(SHUT_RDWR) 
    s.close() 
except Exception: 
    pass 

“坏文件说明”错误的手段(最有可能)的插座已关闭(至少从Python端)。