gpt4 book ai didi

c - 了解 set/getsockopt SO_SNDBUF 大小加倍

转载 作者:太空狗 更新时间:2023-10-29 16:20:05 25 4
gpt4 key购买 nike

您好,我有以下程序来检查 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 说:

[...]    SO_SNDBUF              Sets or gets the maximum socket send buffer in bytes.  The  ker-              nel doubles this value (to allow space for bookkeeping overhead)              when it is set using setsockopt(), and  this  doubled  value  is              returned  by  getsockopt().   The  default  value  is set by the              wmem_default sysctl and the maximum allowed value is set by  the              wmem_max sysctl.  The minimum (doubled) value for this option is              2048.[...]NOTES       Linux assumes that half of the send/receive buffer is used for internal       kernel structures; thus the sysctls are twice what can be  observed  on       the wire.[...]

关于c - 了解 set/getsockopt SO_SNDBUF 大小加倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2031109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com