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中为linux创建一个新线程?

linux - 如何找到哪个进程绑定(bind)了一个套接字但没有监听?

python - 根据级别 0 索引对多索引 Pandas DataFrame 的级别 1 索引进行自定义排序

python - 在哪里可以了解 scrapy SgmlLinkExtractor?

java - 多线程中线程不使用notify()退出等待状态

c++ - 是否可以将对象实例移动到 QT 项目中不同代码点的不同线程?

python-3.x - 在 python 中更改客户端/服务器环境中的工作目录

c++ - Windows 套接字 accept() 返回错误值

python - 在 cron 中运行 headless selenium 时,出现错误 "Pyperclip could not find a copy/paste mechanism for your system"

python - 不同长度向量的余弦相似度?