반응형
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
반응형
'programing' 카테고리의 다른 글
가져온 후 내보낸 모듈이 정의되지 않았습니다. (0) | 2022.07.02 |
---|---|
VueJ가 0이면 입력 값이 표시되지 않음 (0) | 2022.07.02 |
변경된 파일만 다시 컴파일하도록 Makefile을 만들려면 어떻게 해야 합니까? (0) | 2022.07.02 |
C 프로그래밍에서 트리플 마이너스 부호가 나올 수 있나요?그것은 무엇을 뜻하나요? (0) | 2022.07.02 |
TypeError: Vue2에 정의되지 않은 속성 '구성 요소'를 읽을 수 없습니다. (0) | 2022.07.02 |