programing

set/getsockopt SO_SNDBUF 사이즈가 2배가 되는 것을 이해한다.

copyandpastes 2022. 7. 2. 21:39
반응형

set/getsockopt SO_SNDBUF 사이즈가 2배가 되는 것을 이해한다.

안녕하세요 UDP 소켓의 송신 버퍼 크기를 확인하기 위한 다음 프로그램이 있습니다.하지만 반품가치는 좀 헷갈리네요.다음과 같은 간단한 앱을 사용하고 있습니다.

#include <sys/socket.h>
#include <stdio.h>

int main(int argc, char **argv)
{
 int sockfd, sendbuff;
 socklen_t optlen;

 sockfd = socket(AF_INET, SOCK_DGRAM, 0);
 if(sockfd == -1)
     printf("Error");

 int res = 0;

 // Get buffer size
 optlen = sizeof(sendbuff);
 res = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, &optlen);

 if(res == -1)
     printf("Error getsockopt one");
 else
     printf("send buffer size = %d\n", sendbuff);

 // Set buffer size
 sendbuff = 98304;

 printf("sets the send buffer to %d\n", sendbuff);
 res = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, sizeof(sendbuff));

 if(res == -1)
     printf("Error setsockopt");


 // Get buffer size
 optlen = sizeof(sendbuff);
 res = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, &optlen);

 if(res == -1)
     printf("Error getsockopt two");
 else
     printf("send buffer size = %d\n", sendbuff);

 return 0;
}

컴퓨터의 출력은 다음과 같습니다.

송신 버퍼 크기= 129024

송신 버퍼를 98304 로 설정합니다.

새 송신 버퍼 크기 = 196608

내가 뭘 잘못하고 있는지, 아니면 어떻게 결과를 해석해야 하는지 누가 명확히 해줄 수 있나요?

당신은 잘못한 게 없어요.Linux는 사용자가 설정할 때 (커널 내에서) 값을 두 배로 늘리고 쿼리할 때 두 배로 값을 반환합니다. man 7 socket다음과 같이 말합니다.

[...]
소_SNDBUF최대 소켓 송신 버퍼를 바이트 단위로 설정 또는 가져옵니다.그 연기는...nel은 이 값을 2배로 합니다(부기 오버헤드를 위한 공간을 확보합니다).setsockopt를 사용하여 설정되며 이 두 배의 값은getsockopt에 의해 반환됨기본값은 에 의해 설정됩니다.wmem_default sysctl 및 최대 허용값은 에 의해 설정됩니다.wmem_max sysctl.이 옵션의 최소값(배수)은 다음과 같습니다.2048.[...]
메모들Linux 에서는, 송신/수신 버퍼의 반이 내부용으로 사용되고 있는 것을 전제로 하고 있습니다.커널 구조입니다.따라서 sysctls는 관찰할 수 있는 것의 2배입니다.와이어
[...]

언급URL : https://stackoverflow.com/questions/2031109/understanding-set-getsockopt-so-sndbuf-size-doubles

반응형