sockets - Linux中AF_UNIX数据报消息的最大大小是多少?

标签 sockets unix dns datagram

目前,我已达到130688字节的硬限制。如果我尝试在一条消息中发送更大的内容,则会收到ENOBUFS错误。

我已经检查了net.core.rmem_default,net.core.wmem_default,net.core.rmem_max,net.core.wmem_max和net.unix.max_dgram_qlen sysctl选项,并增加了所有选项,但它们没有效果,因为它们与总缓冲区大小而不是消息大小。

我还设置了SO_SNDBUF和SO_RCVBUF套接字选项,但这与上面的问题相同。无论如何,默认套接字缓冲区的大小都是基于_default套接字选项设置的。

我查看了套接字堆栈中返回ENOBUFS的内核源,但是我不清楚它的来源。似乎返回此错误的唯一地方与无法分配内存有关。

最大大小实际上是130688吗?如果不能,可以在不重新编译内核的情况下更改此设置?

最佳答案

AF_UNIX SOCK_DATAGRAM/SOCK_SEQPACKET数据报需要连续的内存。很难找到连续的物理内存,并且分配失败,在内核日志中记录了与此类似的内容:

udgc: page allocation failure. order:7, mode:0x44d0
[...snip...]
DMA: 185*4kB 69*8kB 34*16kB 27*32kB 11*64kB 1*128kB 1*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 3788kB
Normal: 13*4kB 6*8kB 100*16kB 62*32kB 24*64kB 10*128kB 0*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB = 7012kB
[...snip...]
unix_dgram_sendmsg()调用sock_alloc_send_skb() lxr1,后者调用sock_alloc_send_pskb()data_len = 0且header_len =数据报lxr2的大小。 sock_alloc_send_pskb()从“普通” skbuff缓冲区空间分配header_len,从分散/聚集页面lxr3分配data_len。因此,看起来AF_UNIX套接字在当前Linux上不支持分散/聚集。

关于sockets - Linux中AF_UNIX数据报消息的最大大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4729315/

相关文章:

matlab - Mac OS X 上库的回滚兼容版本

go - 包装 net.Conn 会导致挂起读取

javascript - 使用Node.js,如何查看域名是否被注册?

c++ - 通过套接字修改数据包大小

连接被拒绝错误

java - 使用Socket发送和接收图像

iphone - iPhone上是否存在hosts文件?如何改变呢?

javascript - 是否可以有选择地将 Node.js 引入到用普通 PHP/JS/CSS/HTML 构建的 Web 应用程序中?

c++ - 使用 Boost 创建具有向后兼容 ABI 的库

java - 如何拼写检查应用程序中的 JSP 文件?