recv超时会同时产生EAGAIN和ETIMEDOUT?

时间:2018-07-12 08:00:46

标签: sockets glibc

对于通过recv设置了SO_RCVTIMEO的阻塞setsockoptEAGAINETIMEDOUT有什么区别?

我有一个阻塞recv,它有时会失败,但是根据连接到我服务器的客户端的不同,它会以不同的方式失败(返回-1)。一个客户端产生“资源暂时不可用”,另一客户端产生“连接超时”。 socket手册页说

  

如果没有数据传输并且已经达到超时,则   返回-1,并将errno设置为EAGAIN或EWOULDBLOCK

,没有提及ETIMEDOUT。我猜想其中一个客户端仍在生成TCP Keepalive,但是我找不到任何文档。我使用的是Linux 3.10,Centos 7.5。

1 个答案:

答案 0 :(得分:1)

ETIMEDOUT几乎可以肯定是对先前send()的回应。 send()是异步的。如果不返回-1,则意味着数据已传输到本地套接字发送缓冲区中。它是异步发送的,也可以不是异步发送的,如果在此过程中发生错误,则只能通过下一个系统调用(在这种情况下为recv()来传递)。

目前尚不清楚有什么问题要解决