可以在linux中发送的AF_UNIX数据报消息的最大大小是多少?

Jai*_*ime 14 unix sockets 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吗?如果不能在没有重新编译内核的情况下进行更改?

谢谢!

nin*_*alj 13

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...]
Run Code Online (Sandbox Code Playgroud)

unix_dgram_sendmsg()调用sock_alloc_send_skb() lxr1,它调用sock_alloc_send_pskb()data_len= 0且header_len数据报的大小= lxr2.sock_alloc_send_pskb()分配header_len从"正常"的skbuff缓冲空间,并data_len从分散/集中页面lxr3.因此,看起来AF_UNIX套接字不支持当前Linux上的分散/聚集.

  • 优秀作品.这基本上就是我在我的踪迹中发现的,但你提供了实际的理由.我想知道为什么数据报会有这个限制而不是流? (2认同)
  • SOCK_STREAM套接字不保留消息边界. (2认同)
  • @Kaz,所以,他们没有,您必须伪造它。 (2认同)