我正在尝试将默认套接字发送缓冲区大小更改为较小的大小,
以便了解小 UDP 数据报的 UDP 吞吐量如何受到影响。
为此,我使用 setsockopt
带有选项 SO_SNDBUF
的函数和
我正在尝试将缓冲区大小设置为 64 字节。我也用 getsockopt
查看setsockopt
的结果功能。
这是我使用的代码:
int sock_fd;
struct sockaddr_in server_addr;
static int target_port = PORT;
int curr_snd_buff = 0;
int sk_snd_buff = 64;
socklen_t optlen;
if( (sock_fd=socket(AF_INET,SOCK_DGRAM,0)) == -1)
fatal("in socket (client_udp)");
memset(&server_addr, 0, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr=inet_addr(args->a_ip);
server_addr.sin_port=htons(target_port);
if ( sk_snd_buff > 0 ) >{
optlen = sizeof(sk_snd_buff);
// get the default socketh send buffer size
if (getsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, &curr_snd_buff, &optlen) == -1) {
fatal("getting the socket send buffer");
}
printf("* default socket send buffer: %d\n", curr_snd_buff);
printf("* attempting to change it to: %d\n", sk_snd_buff);
if (setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, &sk_snd_buff, optlen) == -1) {
fatal("changing the socket send buffer");
}
if (getsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, &curr_snd_buff, &optlen) == -1) {
fatal("getting the socket send buffer");
}
printf("* new socket send buffer: %d\n", curr_snd_buff);
}
但是,我看到的是缓冲区大小的下限设置为 4608
每次我尝试设置一个小值时的字节数。下面是上面代码的输出:
通过尝试各种尺寸,我发现尺寸 <= 2304 会发生这种情况。对于
更大的尺寸,例如2305,我得到了更大的尺寸:
对于一些更大的尺寸,例如3000,是我拥有的尺寸的两倍
要求:
通过网络搜索,我发现 Linux 将其内的值(value)翻了一番
设置内核时,并在查询时返回加倍的值:
Understanding set/getsockopt SO_SNDBUF
有没有办法减少套接字发送缓冲区大小的最小下限?
例如,将其设置为 64 字节?
最佳答案
最小缓冲区大小是内核的函数。选项 SO_SNDBUF
的 Linux 文档有话要说:
Sets or gets the maximum socket send buffer in bytes. The kernel doubles this value (to allow space for bookkeeping overhead) when it is set using setsockopt(2), and this doubled value is returned by getsockopt(2). The default value is set by the /proc/sys/net/core/wmem_default file and the maximum allowed value is set by the /proc/sys/net/core/wmem_max file. The minimum (doubled) value for this option is 2048.
(socket(7) 联机帮助页)
详细信息可能因不同系统而异,但
关于c - 有没有办法减少套接字发送缓冲区大小的最小下限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29356626/