2011-10-14 41 views
4

Hy,我想知道是否有任何可能找出SEQPACKET的最大長度,除了實驗(a-la for(i = 0; i < 100 ... 00; i ++) (...)))。找出AF_UNIX + SOCK_SEQPACKET的最大消息大小

而且,第二個問題:

如果我收到錯誤號== EMSGSIZE嘗試發送AF_UNIX SEQPACKET,是保證這是因爲最大郵件大小的,或可能有其他原因?

對不起,我的英文。

+0

可能重複[可以在linux中發送的AF_UNIX數據報消息的最大大小是多少?](http://stackoverflow.com/questions/4729315/what-is-the-max-size-of-af -unix-datagram-message-that-c​​an-be-in-linux) –

+0

不是,那個問題就像「最大容量實際上是130688嗎?如果不是這樣,可以在不重新編譯內核的情況下改變它?」。但是我需要在C程序裏面找到最大尺寸,我不需要改變它的值,我也不想將130688這樣的魔術數字硬編碼到程序中。 – grungegurunge

回答

5

限制來自變量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 /網/核心/ wmem_max零下32的值。 我不知道這個幻數在版本之間有多少變化。 /proc/sys/net/core/wmem_max的值似乎因可用的RAM頁面而異。

在我的linux系統中,數值是105472.最大的數據報大小(使用AF_UNIX和SOCK_DGRAM時)是105440.如果我嘗試發送大小爲105441的消息,它將會失敗並顯示EMSGSIZE。

+0

我的數值是212992(= 52 * 4096)。 – johnchen902

相關問題