c - 有没有办法减少套接字发送缓冲区大小的最小下限?

标签 c sockets udp datagram setsockopt

我正在尝试将默认套接字发送缓冲区大小更改为较小的大小,
以便了解小 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
每次我尝试设置一个小值时的字节数。下面是上面代码的输出:
  • 默认套接字发送缓冲区:212992
  • 试图将其更改为:2304
  • 新的套接字发送缓冲区:4608

  • 通过尝试各种尺寸,我发现尺寸 <= 2304 会发生这种情况。对于
    更大的尺寸,例如2305,我得到了更大的尺寸:
  • 默认套接字发送缓冲区:212992
  • 试图将其更改为:2305
  • 新的套接字发送缓冲区:4610

  • 对于一些更大的尺寸,例如3000,是我拥有的尺寸的两倍
    要求:
  • 默认套接字发送缓冲区:212992
  • 试图将其更改为:3000
  • 新的套接字发送缓冲区:6000

  • 通过网络搜索,我发现 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) 联机帮助页)

    详细信息可能因不同系统而异,但
  • 这解释了您看到的加倍 - 缓冲区的输出字节容量是您设置的大小,但内核保留并报告总共两倍的空间。
  • 至少在 Linux 上,您将无法按照自己的意愿设置尽可能小的缓冲区。我猜想其他系统会有相同数量级的约束。
  • 关于c - 有没有办法减少套接字发送缓冲区大小的最小下限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29356626/

    相关文章:

    c - 使用 libcurl 检索到的 header 信息来确定文件名

    c - Linux NFQUEUE 处理问题

    javascript - http.get 上的 "socket hang up"

    c - TCP_KEEPIDLE 应该低于 TCP_KEEPINTVL 吗?

    c - sockaddr_in 导致段错误?

    iOS NSURLConnection 错误-1002

    java - DatagramPacket - getData 是否总是返回传递的相同缓冲区?

    android - 带有 VpnService 的 Android 防火墙。响应已传递,但抛出 SocketTimeoutException

    c - Mongo c driver find查询错误处理

    c - C中的字符串操作