首页 文章

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

提问于
浏览
4

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

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

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

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

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

1 回答

  • 1

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

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

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

    所以,只知道您的发送缓冲区大小不是Linux或者* BSD,网络堆栈是开源的,并且有很好的文档记录(在Linux中,如果我没记错的话,如果我的2.4时代的知识仍然有用,那么搜索 SO_SNDBUFtxqueuelen 给你很好的起点);否则,可能不是 . 当然,Linux公开了所有信息,以便在 /proc 文件系统中的某个地方公开,所以一旦你知道你想要寻找什么,你就可以找到它 . * BSD在那里没有很多东西 . 甚至Windows也有一系列相关的性能计数器 .

相关问题