8

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

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

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

4

2 回答 2

11

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

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

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

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

于 2012-11-26T01:25:15.643 回答
5

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

于 2012-11-26T01:05:50.173 回答