找出AF_UNIX + SOCK_SEQPACKET最大邮件大小

gru*_*nge 4 c unix sockets linux

Hy,我想知道是否有任何可能找出除实验之外的SEQPACKET的最大长度(a-la为(i = 0; i <100 ... 00; i ++)send(...))).

而且,第二个问题:

如果我收到errno == EMSGSIZE尝试发送AF_UNIX SEQPACKET,是否保证它是因为最大邮件大小,或者可能还有其他一些原因?

对不起我的英语不好.

SKi*_*SKi 5

限制来自变量sysctl_wmem_default.它可以在proc文件系统中查看:/proc/sys/net/core/wmem_max

在这一点上,不同的Linux版本可能有不同的实现.但是UNIX域套接字有这种代码:

sk->sk_sndbuf = sysctl_wmem_default;
Run Code Online (Sandbox Code Playgroud)

err = -EMSGSIZE;
if (len > sk->sk_sndbuf - 32)
    goto out;
Run Code Online (Sandbox Code Playgroud)

所以实际的限制是:/ proc/sys/net/core/wmem_max的值减去32.我不知道这个神奇数字在版本之间有多大变化./ proc/sys/net/core/wmem_max的值似乎因可用的ram页面而异.

在我的linux框中,值为105472.最大数据报大小(使用AF_UNIX和SOCK_DGRAM时)为105440.如果我尝试发送大小为105441的消息,它将失败并显示EMSGSIZE.