1

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

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

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

谢谢,

4

1 回答 1

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

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

于 2012-11-15T19:40:58.823 回答