2011-10-14 2 views
4

Hy, 실험적 (a-la for (i = 0; i < 100 ... 00; i ++)을 제외하고 SEQPACKET의 최대 길이를 알 수있는 가능성이 있는지 궁금합니다. (...))).AF_UNIX + SOCK_SEQPACKET 최대 메시지 크기를 찾으십시오

그리고, 두 번째 질문 : 나는 errno를 == EMSGSIZE가 AF_UNIX SEQPACKET를 보내려고받은 경우

, 그것 때문에 최대 메시지 크기의 보장, 또는 어떤 다른 이유가있을 수있다?

영어로 죄송합니다.

+0

가능한 중복 [리눅스에서 보낼 수있는 AF_UNIX 데이터 그램 메시지의 최대 크기는 무엇입니까?] (http://stackoverflow.com/questions/4729315/what-is-the-max-size-of-af -unix-data-messages-sent-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 값은 사용 가능한 램 페이지에 따라 달라질 수 있습니다.

내 리눅스 박스에서 값은 105472입니다. 최대 데이터 그램 크기 (AF_UNIX와 SOCK_DGRAM을 사용할 때)는 105440입니다. 크기가 105441 인 메시지를 보내려고하면 EMSGSIZE와 함께 실패합니다.

+0

내 값은 212992 (= 52 * 4096)입니다. – johnchen902

관련 문제