在 UDP 套接字上使用默认(阻塞)行为时,在这种情况下,对 sendto() 的调用会阻塞吗?我基本上对 Linux 行为感兴趣。
对于 TCP,我知道如果发送窗口已满,拥塞控制会使 send() 调用阻塞,但是 UDP 呢?它有时甚至会阻塞还是只是让数据包在较低层被丢弃?
最佳答案
如果您填满了套接字缓冲区,则可能会发生这种情况,但它高度依赖于操作系统。由于 UDP 不提供任何保证,当您的套接字缓冲区已满时,您的操作系统可以决定做任何事情:阻塞或丢弃。您可以尝试增加 SO_SNDBUF 来临时缓解。
这甚至可能取决于系统的微调,例如它还可能取决于网络接口(interface)驱动程序中 TX 环的大小。 iperf mailing list 中有一些关于此的讨论。 ,但您确实想与您的操作系统的开发人员讨论这个问题。特别注意 O_NONBLOCK 和 EAGAIN/EWOULDBLOCK。
关于network-programming - UDP sendto() 何时阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4165174/