我在理解Linux中套接字的工作方式时遇到了一些问题。
setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(int));
write = write(sockfd, buf, len);
在上述代码中,由于写入是缓冲的,因此发送超时没有任何意义(当用户空间缓冲区被复制到内核缓冲区时,写系统调用将立即返回)。发送缓冲区大小是更重要的参数,但似乎发送超时并没有什么值得注意的作用。但我肯定是错的,因为我见过很多使用SO_SNDTIMEO的代码。如果接收者非常缓慢,用户空间代码如何使用SO_SNDTIMEO进行超时?
SO_SNDTIMEO
的原因是,在代码库中的某个地方,套接字被设置回阻塞模式(可能仅针对特定操作暂时性地),并且代码的作者希望在它被设置回阻塞模式的时间内,套接字具有超时功能。 (或者同样可能的是,应用程序最初是使用阻塞模式套接字编写的,后来转换为使用非阻塞套接字,而代码的作者只是忘记删除现在不再需要的 SO_SNDTIMEO 调用) - Jeremy Friesner