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

0xh*_*ker 7 sockets network-programming setsockopt

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

setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(int));
write = write(sockfd, buf, len);
Run Code Online (Sandbox Code Playgroud)

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

use*_*421 8

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

事实并非如此.超时适用于阻止模式.非阻塞recv()不会阻塞,因此也不能超时.

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

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


Nea*_*eal 5

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