找出AF_UNIX + SOCK_SEQPACKET的最大消息大小

Hy,我想知道是否有可能findSEQPACKET的最大长度除了实验(a-la for(i = 0; i <100 … 00; i ++)send(…)))。

而第二个问题是:

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

对不起我的英语不好。

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

不同的Linux版本在这一点上可能有不同的实现。 但是对于UNIX域套接字有这样的代码:

 sk->sk_sndbuf = sysctl_wmem_default; 

 err = -EMSGSIZE; if (len > sk->sk_sndbuf - 32) goto out; 

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

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