超时 recv 产生 EAGAIN 和 ETIMEDOUT?
Timed out recv producing both EAGAIN and ETIMEDOUT?
对于通过 setsockopt
设置 SO_RCVTIMEO
的阻塞 recv
,EAGAIN
和 ETIMEDOUT
之间有什么区别?
我有一个阻塞 recv
,它偶尔会失败,但它会以不同的方式失败(返回 -1),具体取决于连接到我的服务器的客户端。一个客户端生成 "Resource temporarily unavailable",另一个生成 "Connection timed out"。 socket
手册页说
if no data has been transferred and the timeout has been reached then
-1 is returned with errno set to EAGAIN or EWOULDBLOCK
没有提及 ETIMEDOUT。我猜其中一个客户仍在生成 TCP keepalive,但我找不到任何关于此的文档。我在 Linux 3.10,Centos 7.5.
ETIMEDOUT
几乎可以肯定是对之前 send()
的回应。 send()
是异步的。如果不是 return -1,则意味着数据已传输到本地套接字发送缓冲区。它是异步发送或不发送的,如果该过程中出现错误,它只能通过下一个系统调用传递:在本例中,recv()
.
不清楚这里有什么问题需要解决
对于通过 setsockopt
设置 SO_RCVTIMEO
的阻塞 recv
,EAGAIN
和 ETIMEDOUT
之间有什么区别?
我有一个阻塞 recv
,它偶尔会失败,但它会以不同的方式失败(返回 -1),具体取决于连接到我的服务器的客户端。一个客户端生成 "Resource temporarily unavailable",另一个生成 "Connection timed out"。 socket
手册页说
if no data has been transferred and the timeout has been reached then -1 is returned with errno set to EAGAIN or EWOULDBLOCK
没有提及 ETIMEDOUT。我猜其中一个客户仍在生成 TCP keepalive,但我找不到任何关于此的文档。我在 Linux 3.10,Centos 7.5.
ETIMEDOUT
几乎可以肯定是对之前 send()
的回应。 send()
是异步的。如果不是 return -1,则意味着数据已传输到本地套接字发送缓冲区。它是异步发送或不发送的,如果该过程中出现错误,它只能通过下一个系统调用传递:在本例中,recv()
.
不清楚这里有什么问题需要解决