【发布时间】:2012-11-13 11:09:25
【问题描述】:
我在理解 Linux 中套接字的工作时遇到了一些问题。
setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(int));
write = write(sockfd, buf, len);
在上面的代码中,由于写入被缓冲,发送超时没有任何意义(当用户空间缓冲区被复制到内核缓冲区时,写入系统调用将立即返回)。发送缓冲区大小是更重要的参数,但发送超时似乎没有任何价值。但我肯定错了,因为我见过很多使用 SO_SNDTIMEO 的代码。假设接收器很慢,用户空间代码如何使用 SO_SNDTIMEO 超时?
【问题讨论】:
-
你能说明你想要达到什么结果吗?
-
没有我想要达到的结果,我问这个问题是为了了解套接字的工作原理,特别是为什么 SO_SNDTIMEO 甚至存在?
-
这个答案可能会帮助你理解 SO_SNDTIMEO:stackoverflow.com/a/4182564/10682
-
@Alexey Feldgendler - 这是一个有效的问题。如果 SO 仅限于“实用”,他们将不得不删除 20% 的问题。这里有很多令人麻木的晦涩问题。
-
我能想到在非阻塞套接字上设置
SO_SNDTIMEO的唯一原因是,在代码库的某个地方,套接字被设置回阻塞模式(可能只是临时用于特定操作) , 并且代码的作者希望套接字在设置回阻塞模式的时间内超时。 (或者,很可能,应用程序最初是为使用阻塞模式套接字而编写的,后来被转换为使用非阻塞套接字,而代码作者只是忘记取出现在不必要的 SO_SNDTIMEO 调用)
标签: sockets network-programming setsockopt