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



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

1) epoll 可以在 connect() 进行时同时获取 ECONNDENY 和 ETIMEOUT errno。它们不是都表示远程服务器无法接受连接吗?它们有何不同,客户如何区分?

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

谢谢

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

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

最新更新