对于通过recv
设置了SO_RCVTIMEO
的阻塞setsockopt
,EAGAIN
和ETIMEDOUT
有什么区别?
我有一个阻塞recv
,它有时会失败,但是根据连接到我服务器的客户端的不同,它会以不同的方式失败(返回-1)。一个客户端产生“资源暂时不可用”,另一客户端产生“连接超时”。 socket
手册页说
如果没有数据传输并且已经达到超时,则 返回-1,并将errno设置为EAGAIN或EWOULDBLOCK
,没有提及ETIMEDOUT。我猜想其中一个客户端仍在生成TCP Keepalive,但是我找不到任何文档。我使用的是Linux 3.10,Centos 7.5。
答案 0 :(得分:1)
ETIMEDOUT
几乎可以肯定是对先前send()
的回应。 send()
是异步的。如果不返回-1,则意味着数据已传输到本地套接字发送缓冲区中。它是异步发送的,也可以不是异步发送的,如果在此过程中发生错误,则只能通过下一个系统调用(在这种情况下为recv()
来传递)。
目前尚不清楚有什么问题要解决