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

时间:2012-11-15 19:16:55

标签: python sockets tcp epoll

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

1)当connect()正在进行时,epoll可以获得ECONNREFUSED和ETIMEOUT错误。它们是否都表示远程服务器无法接受连接?它们有何不同,客户如何区分?

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

谢谢,

1 个答案:

答案 0 :(得分:1)

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

  2. socket.recv()返回一个没有错误的空字符串只是EOF条件,对应于C中的空读。这发生在另一方关闭连接或关闭它以进行写入时。在发生EOF时通知EPOLLIN是正常的,因为你想知道EOF(并且因为你可以安全地从套接字recv而不挂它)。