recv(...)是这样运作的吗?

Bre*_*ett 5 c sockets posix recv

我将套接字的超时设置SO_RCVTIMEO为10秒.此问题特定于流套接字(TCP).当我recv(...)从手册页中收集的内容打电话时,这就是我所期待的:

  1. 如果远程关闭连接,则无论超时如何,它都会立即返回0.
  2. 如果超时,并没有收到数据,那么我们得到一个返回-1和errnoEAGAINEWOULDBLOCK.
  3. 如果套接字上发生错误,它会立即返回-1,然后errno设置正确.
  4. 如果数据可用,套接字将等待,直到超时发生,然后再返回.这次它将在10秒内返回,并收到总字节数.

这是正确的行为吗?我只是想确保我正确理解文档.

谢谢!布雷特

alk*_*alk 6

  1. 正确.
  2. 有两种不同的规格(遗憾的是我目前无法测试)
    2.1 ETIMEOUT将被退回.(EAGAIN或者EWOULDBLOCK是在非阻挡的套接字如果没有数据可立即返回.)http://pubs.opengroup.org/onlinepubs/9699919799/functions/recv.html
    2.2 EAGAINEWOULDBLOCK为2.1下提到的两种可能性将被返回的HTTP:/ /man7.org/linux/man-pages/man2/recvmsg.2.html
  3. 正确.
  4. 如果读取了至少1个字节,则套接字可能随时返回,即使读取的内容较少,然后告知并且超时尚未到期.

  • POSIX明确指出,对于`SO_RCVTIMEO`并且没有收到数据,需要一个`EAGAIN`或`EWOULDBLOCK`:http://pubs.opengroup.org/onlinepubs/009695399/functions/setsockopt.html (2认同)