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

Sockets 如何在非阻塞套接字上设置发送超时?,sockets,network-programming,setsockopt,Sockets,Network Programming,Setsockopt,我在理解Linux中套接字的工作原理时遇到了一些问题 setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(int)); write = write(sockfd, buf, len); 在上面的代码中,当写入被缓冲时,发送超时没有任何意义(当用户空间缓冲被复制到内核缓冲中时,写入系统调用将立即返回)。发送缓冲区大小是更重要的参数,但发送超时似乎并没有什么用处。但我肯定错了,因为我看到了很多使用sou SNDTIMEO

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

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

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

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

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

事实并非如此。超时用于阻塞模式。非阻塞的
recv()
不会阻塞,因此也不会超时

我见过很多使用sou SNDTIMEO的代码


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

你能澄清你想要达到的结果吗?我没有想要达到的结果,我问这个问题是为了理解套接字的工作原理,特别是为什么会有这样的时间?这个答案可能会帮助你理解这样的时间:@Alexey Feldgendler-这是一个有效的问题。如果仅限于“实用”,他们将不得不删除20%的问题。这里有很多令人麻木的模糊问题被问和回答。我能想到的在非阻塞套接字上设置
SO\SNDTIMEO
的唯一原因是,在代码库的某个地方,套接字被设置回阻塞模式(可能只是暂时用于特定操作),代码的作者希望套接字在被设置回阻塞模式的时间内有一个超时。(或者,同样可能的是,应用程序最初是使用阻塞模式套接字编写的,后来被转换为使用非阻塞套接字,代码作者只是忘记了执行现在不必要的SO\u SNDTIMEO调用)在linux中,如何确保对数据包的发送或写入是阻塞的,即,仅当内核在整个缓冲区内收到ACK时,写入或发送才会返回(缓冲区将被分解为多个tcp数据包)@mc_87您不能。如果你想要一个确认,你必须在应用层自己发送一个。那么,如果在应用层我不能阻止直到我的最后一个tcp确认,那么So_sndtime将如何有用?@mc_87超时超时超时块在阻止模式下发生,当你发送到一个完整的套接字send butfer,或接收到一个空的套接字接收缓冲区。发送时等待确认的部分只是你想象中的虚构。TCP是一种流协议,而不是请求/响应协议。