python - TCP 非阻塞 socket.connect() 和 socket.recv() 错误问题。 (Python 或 C)

标签 python sockets tcp epoll

我正在用 Python 脚本对一个简单的 HTTP 重定向服务器进行一些压力测试。该脚本设置了带有非阻塞套接字的 epoll(边缘触发模式)。但是我观察到一些我不太明白的东西,

1) epoll 可以在connect() 过程中得到ECONNREFUSED 和ETIMEOUT errno。它们不是都表示远程服务器无法接受连接吗?它们有何不同,客户如何区分?

2) 有时当 epoll 通知 EPOLLIN 时,socket.recv() 返回空字符串而不会抛出任何异常(或 C 中的 errno),我可以继续读取套接字而不会收到任何异常或错误,它总是返回空字符串。这是为什么?

谢谢,

最佳答案

  1. ECONNREFUSED 表示连接被服务器拒绝,而 ETIMEOUT 表示连接尝试已超时,即没有指示(正或否定)关于从对等方收到的连接尝试。

  2. socket.recv() 返回一个空字符串没有错误只是 EOF 条件,对应于 C 中的一个空读取。当对方关闭连接时会发生这种情况,或者关闭它下来写作。当 EOF 发生时通知 EPOLLIN 是正常的,因为您想知道 EOF(并且因为您可以安全地从套接字recv 而不会挂起)。

关于python - TCP 非阻塞 socket.connect() 和 socket.recv() 错误问题。 (Python 或 C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13404538/

相关文章:

python - 为什么pyodbc在Fedora 27 ppc64上生成乱码错误信息?

python - 可以从列表理解中返回两个列表吗?

python - 来自networkx的g.nodes()不能与random.choice()一起使用

python - 开发方法导出ipa报错

networking - 谁能解释一下 TCP 中的 TSO/LRO 硬件功能是什么?

java - 为什么我的浏览器发送两个具有相同属性(除了推送之外)的数据包?

java - .Net 客户端与使用原始数据的 Java 服务器

mysql - 找不到 mysqld.sock : Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")

java - 获取 java.net.SocketException : Malformed reply from SOCKS server Exception

c# - 中断后重连TCPClient