getsockopt() 返回的值是之前由 setsockopt() 设置的值的两倍
getsockopt() returns a value twice the value that was previously set by setsockopt()
我正在尝试增加用于与 linux 设备驱动程序交互的原始套接字的SO_RCVBUF
。默认rmem_default/rmem_max
都太小了,即 163840。因此,我使用以下堆栈溢出问题/答案来帮助我。一切都在工作,或者至少看起来是这样。但是,当我得到我为SO_RCVBUF
设置的值时,它会返回我设置的值 * 2?有人知道这是为什么吗?
int recv_val = SOCK_RCV_BUF_MAX; socklen_t size = sizeof(recv_val);
if(setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &recv_val, size) < 0)
{
fprintf(stderr, "Error setsockopt(SO_RCVBUF): %sn", strerror(errno));
}
else
printf("Set the SO_RCVBUF to %dn", recv_val);
recv_val = 0;
if (getsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &recv_val, &size) < 0)
{
fprintf(stderr, "Error getsockopt(SO_RCVBUF): %sn", strerror(errno));
}
else if(recv_val == SOCK_RCV_BUF_MAX)
{
printf("Successfully set the buffer max to %dn", SOCK_RCV_BUF_MAX);
}
else
printf("Failed to set the buffer to max (%d), val = %dn", SOCK_RCV_BUF_MAX, recv_val);
输出
Set the SO_RCVBUF to 64000000
Failed to set the buffer to max (64000000), val = 128000000
更改为recv_val = SOCK_RCV_BUF_MAX/2
输出
Set the SO_RCVBUF to 32000000
Successfully set the buffer max to 64000000
如果我没有使用 setsockopt() 设置值并为我的套接字调用 getsockopt(),我会得到正确的默认值
Failed to set the buffer to max (64000000), val = 163840
你给setsockopt(SO_RCVBUF)
的值只是一个提示,而不是绝对的。 如果需要,允许套接字提供程序使用不同的值。您从getsockopt(SO_RCVBUF)
得到的是使用的实际值。
你所看到的实际上是记录在案的行为:
http://man7.org/linux/man-pages/man7/socket.7.html
SO_RCVBUF 设置或获取最大套接字接收缓冲区(以字节为单位)。 当使用setsockopt(2)
设置时,内核会加倍此值(以留出记账开销的空间),并且此加倍值由getsockopt(2)
返回。 默认值由/proc/sys/net/core/rmem_default
文件设置,允许的最大值由/proc/sys/net/core/rmem_max
文件设置。此选项的最小(双倍)值为 256。
相关文章:
- 重复使用预分配的向量<复杂<double>>作为<double>长度两倍的向量
- 如何使用 pthreads 以正确的方式设置两个线程之一的优先级
- 计算C++两倍的差值
- 为什么当我进入退出条件时,程序会打印两倍的默认条件而不是退出 while 循环?
- 内存移动的性能与memcpy相比是两倍?
- Qt 是 JSON 精度的两倍
- 不完整的多线程光线追踪器花费的时间是预期的两倍
- C++随机函数给出的相同整数是输出的两倍
- 为什么我的最终向量是它应该大小的两倍并且具有前导 0?
- 为什么即使在从int到两倍的类型施放后,小数也没有小数
- 如何将固定精度的两倍格式化为给定的长度
- getsockopt() 返回的值是之前由 setsockopt() 设置的值的两倍
- MF SinkWriter mp4文件的播放持续时间是添加音频样本时的一半,图像的播放速度也是添加音频样本的两倍
- 无论如何,是否可以使用setCursorPos(int,int)函数,但没有采用两个int使它需要速度较慢的两倍
- 是一个包含两个INT(只有两个INT)的结构,保证是大小(INT)的两倍
- C++ "time.h"测量的运行时间是实际值的两倍
- 退出申请致电两倍
- SSE42 & STTNI - PcmpEstrM比PcmpIstrM慢两倍,是真的吗?
- 在同一台机器上,是否保证两倍值的不精确性是一致的
- 套接字SO_RCVTIMEO超时是C++/VC++中设置值的两倍