我正在对Python脚本中的简单HTTP重定向服务器进行一些压力测试。该脚本使用epoll(边缘触发模式)设置,带有非阻塞套接字。但是我发现了一些我不太了解的东西,
1)当connect()正在进行时,epoll可以获得ECONNREFUSED和ETIMEOUT错误。它们是否都表示远程服务器无法接受连接?它们有何不同,客户如何区分?
2)有时当epoll通知EPOLLIN时,socket.recv()返回空字符串而不抛出任何异常(或C中的errno),我可以继续读取套接字而不会出现任何异常或错误,它只是总是返回空串。那是为什么?
谢谢,
答案 0 :(得分:1)
ECONNREFUSED
表示服务器拒绝连接,而ETIMEOUT
表示连接尝试已超时,即没有关于连接尝试的指示(正面或负面)是从同行收到的。
socket.recv()
返回一个没有错误的空字符串只是EOF条件,对应于C中的空读。这发生在另一方关闭连接或关闭它以进行写入时。在发生EOF时通知EPOLLIN
是正常的,因为你想知道EOF(并且因为你可以安全地从套接字recv
而不挂它)。