我一直在阅读python中的UDP套接字。
默认情况下,配置套接字以便发送或接收数据块,停止程序执行直到套接字准备就绪。调用send()等待缓冲区空间可用于传出数据,并调用recv()等待另一个程序发送可读取的数据。
我理解接收部分,它必须等到另一端发送。 但为什么发送阻止?它在书中说:" send()等待缓冲区空间可用"。什么是缓冲空间?
是针对整个操作系统还是针对每个正在运行的应用程序定义。
有没有办法知道有多少缓冲区可用?
答案 0 :(得分:1)
BSD套接字和POSIX文档引用的缓冲区,也可能是您正在阅读的内容,是一个per 套接字缓冲区,而不是每个系统或每个应用程序。它与.grid()
设置的相同。当该缓冲区已满时,SO_SNDBUF
将阻止。
但真正的问题是,为什么缓冲区会变满?
在你的应用程序可以看到的东西下面,内核通常有类似每个NIC的传输缓冲区环。当NIC完成将一个缓冲区的数据输出到线路上时,它会从环上拉出另一个数据。当环上有空间时,它从一个套接字缓冲区中拉出另一个发送缓冲区。或者,如果等待的缓冲区太多,它会删除其中一些缓冲区,然后拉出一个缓冲区。因此,部分是系统范围的(或者至少是NIC范围内的)。
因此,只知道您的发送缓冲区大小并不能真正告诉您所关注的所有内容,并且要真正了解它,您需要提出特定于内核的问题。如果那是Linux或者* BSD,网络堆栈是开源的,并且有很好的文档记录(在Linux中,如果我没记错的话,如果我的2.4时代的知识仍然有用,那么搜索send
和{{1}给你很好的起点);否则,可能不是。当然,Linux公开了所有信息,以便在SO_SNDBUF
文件系统中的某个地方公开,所以一旦你知道你想要查找什么,你就可以找到它。 * BSD没有那么暴露,但那里有很多东西。甚至Windows也有一系列相关的性能计数器。