超时 recv 产生 EAGAIN 和 ETIMEDOUT?

Timed out recv producing both EAGAIN and ETIMEDOUT?

对于通过 setsockopt 设置 SO_RCVTIMEO 的阻塞 recvEAGAINETIMEDOUT 之间有什么区别?

我有一个阻塞 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().

不清楚这里有什么问题需要解决