gpt4 book ai didi

linux - 发送十二个数据包后 PF_UNIX 套接字阻塞

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:44 25 4
gpt4 key购买 nike

我这辈子从来没有遇到过这样的事情。

我在我的 C 程序中创建了一些简单的 uds 套接字,(我将用 python 展示我的示例,但它最终调用的是相同的系统调用/API)

最奇怪的事情发生了

from socket import *

a = socket(PF_UNIX, SOCK_DGRAM)

a.connect("SomePathAlreadyBounded")

for i in range(0,13):
print(str(i))
a.send("hey")

这最多打印 12 个,然后开始阻塞...只有当服务器从套接字缓冲区读取时才解除阻塞...。我已经尝试过 setsockopt SO_SNDBUF 下的选项和 SO_RCVBUF还没有成功

有没有人遇到过这种问题?如果是这样,我该如何解决它……我想强调一个事实 send在发送 12 个数据包后开始完全阻塞......无论它们的大小......

最佳答案

SOCK_DGRAM 比 SOCK_STREAM 更消耗资源,因为必须保留数据包边界以遵守数据报契约(Contract)。因此,根据底层系统,驱动程序可以在其内部缓冲区已满时阻止发送方。

但是当我在我的 FreeBSD 机器上测试时,我的行为略有不同:

  • 对于小数据包,它最多接受 64 个数据包
  • 它只接受了 3 个 1024 字符的数据包
  • 它给出了一个错误而不是阻塞

经过更多的研究,FreeBSD 和 Linux 之间的差异以某种方式被记录在案,因为在 FB 上,如果 系统无法分配内部缓冲区发送 可能会因 ENOBUFS 而失败而此错误在 Linux 手册页上不存在。

TL/DR:发生的事情是正常的:内部缓冲区已满并且 send 会阻止调用者,除非您将套接字置于非阻塞模式。也许某些内核参数允许在 Linux 上增加 12 的限制,但总会有一个限制。

关于linux - 发送十二个数据包后 PF_UNIX 套接字阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38845655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com