Python 关闭 TCP 连接

标签 python multithreading sockets tcp

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

提前致谢

最佳答案

错误的文件描述符很可能意味着套接字已被另一个线程关闭。

这里有一些关于一般做法的想法。对于客户端,知道它已断开连接的一种方法是检查 recv() 值是否为 0。如果是,则表示远程端已关闭连接。基本上,您应该使用选择(或轮询)并传递所有客户端和服务器的 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

关于Python 关闭 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18557287/

相关文章:

c - 在 C++ 中并行化素数生成器

java - Java多线程中如何使用CountDownLatch?

node.js - 使用nodejs实时播放HLS文件

c - RECV 动态内存分配

python - 付款方式 token 在 Braintree 中无效

python - 显示分组数据的时间序列和平均值

python - FFT:查找并消除信号中的噪声 50Hz

python - 从python中的VideoCapture opencv获取特定帧

multithreading - 保存 fprintf 调用的变量参数列表

c++ - 通过套接字进行数据传输[TCP]如何在c/c++中打包多个整数并使用send()recv()传输数据?