如何在非阻塞套接字上发送超时?

时间:2012-11-26 00:04:56

标签: sockets network-programming setsockopt

我在理解Linux中套接字的工作方面遇到了一些问题。

setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(int));
write = write(sockfd, buf, len);

在上面的代码中,写入被缓冲,发送超时没有任何意义(当用户空间缓冲区被复制到内核缓冲区时,写入系统调用将立即返回)。发送缓冲区大小是更重要的参数,但发送超时似乎没有什么值得的。但我当然错了,因为我已经看到了很多使用SO_SNDTIMEO的代码。假设接收器非常慢,用户空间代码如何使用SO_SNDTIMEO超时?

2 个答案:

答案 0 :(得分:8)

  

如何在非阻塞套接字上发送超时?​​

不是。超时适用于阻止模式。非阻塞recv()不会阻止,因此也不能超时。

  

我见过很多使用SO_SNDTIMEO的代码。

不是非阻塞模式,除非相关代码是无意义的。

答案 1 :(得分:4)

SO_SNDTIMEO对阻塞套接字很有用。如果套接字的缓冲区已满,send()可以阻塞,在这种情况下,使用SO_SNDTIMEO套接字选项可能很有用。对于非阻塞套接字,如果套接字的缓冲区已满,send将立即失败,因此使用非阻塞套接字设置SO_SNDTIMEO没有意义。