UDP에서 buffer size
server 프로그램에서
if( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) { perror("socket error "); exit(0); } ... if( (bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) < 0 ) { perror("bind error "); exit(0); } ... sleep(10); while(i=0;;i++) { n = recvfrom(sockfd, (void *)buf, sizeof(buf), 0, (struct sockaddr *)&clientaddr, &clilen); printf("i=[%d]\n", i); } close(sockfd);
이러한 방식으로 소켓을 열고 bind, 10초 후에 recvfrom을 시작합니다.
이때의
/proc/sys/net/core/rmem_max
/proc/sys/net/core/rmem_default
값은 모두 65535 입니다.
클라이언트가 서버가 시작되고 10초 이내에
65536 -1 - 20(ip header) -8(udp header) byte만큼의 버퍼를 sendto 하면(사실은 더 보낼수도 없더군요. 이게 현재 설정에서 보낼 수 있는 최대값입니다)
서버의 소켓 버퍼에 저장이 되고 서버가 recvfrom을 호출하면 잘 읽습니다.
클라이언트가
(65536/2 -1 -20 -8 ) byte만큼의 버퍼를 두번 sendto 하면 서버의 소켓 버퍼에 첫번째 send한 내용만 저장되고 두번째 보낸 데이터는 저장되지 않습니다.
혹시나 해서 보내는 값을 줄여봤는데... (65536/2 -1 -20 -8 -446) 크기를 보내면 (이값이 한계값입니다) 두번째 보낸 데이터까지 저장이 됩니다.
테스트 시에 클라이언트의 버퍼 크기와 서버의 버퍼크기는 동일하게 했습니다.
socket buffer 에 udp diagram이 저장될 때 ip header 나 udp header까지 저장이 되나요? - 제 생각에는 udp data만 저장이 될것 같은데 -
또 ip header 와 udp header까지 같이 저장이 된다고 해도 계산상으로 두번째 보낸 데이터까지 저장이 될 수 있어야 할것 같은데.. 왜 이런 현상이 일어나는지 알 수가 없군요.
도움 부탁드립니다.
[환경]
$ uname -a
Linux xxx 2.4.18 #7 SMP Wed Feb 19 15:44:28 KST 2003 i686 unknown
댓글 달기