什么时候会阻塞socket.send()阻塞? (UDP)

时间:2015-05-24 22:31:40

标签: sockets udp send blocking

我一直在阅读python中的UDP套接字。

  

默认情况下,配置套接字以便发送或接收数据块,停止程序执行直到套接字准备就绪。调用send()等待缓冲区空间可用于传出数据,并调用recv()等待另一个程序发送可读取的数据。

我理解接收部分,它必须等到另一端发送。 但为什么发送阻止?它在书中说:" send()等待缓冲区空间可用"。什么是缓冲空间?

是针对整个操作系统还是针对每个正在运行的应用程序定义。

有没有办法知道有多少缓冲区可用?

1 个答案:

答案 0 :(得分:1)

BSD套接字和POSIX文档引用的缓冲区,也可能是您正在阅读的内容,是一个per 套接字缓冲区,而不是每个系统或每个应用程序。它与.grid()设置的相同。当该缓冲区已满时,SO_SNDBUF将阻止。

但真正的问题是,为什么缓冲区会变满?

在你的应用程序可以看到的东西下面,内核通常有类似每个NIC的传输缓冲区环。当NIC完成将一个缓冲区的数据输出到线路上时,它会从环上拉出另一个数据。当环上有空间时,它从一个套接字缓冲区中拉出另一个发送缓冲区。或者,如果等待的缓冲区太多,它会删除其中一些缓冲区,然后拉出一个缓冲区。因此,部分是系统范围的(或者至少是NIC范围内的)。

因此,只知道您的发送缓冲区大小并不能真正告诉您所关注的所有内容,并且要真正了解它,您需要提出特定于内核的问题。如果那是Linux或者* BSD,网络堆栈是开源的,并且有很好的文档记录(在Linux中,如果我没记错的话,如果我的2.4时代的知识仍然有用,那么搜索send和{{1}给你很好的起点);否则,可能不是。当然,Linux公开了所有信息,以便在SO_SNDBUF文件系统中的某个地方公开,所以一旦你知道你想要查找什么,你就可以找到它。 * BSD没有那么暴露,但那里有很多东西。甚至Windows也有一系列相关的性能计数器。