我正在用 Python 脚本对一个简单的 HTTP 重定向服务器进行一些压力测试。该脚本设置了带有非阻塞套接字的 epoll(边缘触发模式)。但是我观察到一些我不太明白的东西,
1) epoll 可以在connect() 过程中得到ECONNREFUSED 和ETIMEOUT errno。它们不是都表示远程服务器无法接受连接吗?它们有何不同,客户如何区分?
2) 有时当 epoll 通知 EPOLLIN 时,socket.recv() 返回空字符串而不会抛出任何异常(或 C 中的 errno),我可以继续读取套接字而不会收到任何异常或错误,它总是返回空字符串。这是为什么?
谢谢,
最佳答案
ECONNREFUSED
表示连接被服务器拒绝,而ETIMEOUT
表示连接尝试已超时,即没有指示(正或否定)关于从对等方收到的连接尝试。socket.recv()
返回一个空字符串没有错误只是 EOF 条件,对应于 C 中的一个空读取。当对方关闭连接时会发生这种情况,或者关闭它下来写作。当 EOF 发生时通知EPOLLIN
是正常的,因为您想知道 EOF(并且因为您可以安全地从套接字recv
而不会挂起)。
关于python - TCP 非阻塞 socket.connect() 和 socket.recv() 错误问题。 (Python 或 C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13404538/