繁体   English   中英

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

Is there a way to reduce the minimum lower limit of the socket send buffer size?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试将默认套接字发送缓冲区大小更改为较小的大小,以便了解UDP吞吐量如何受到小UDP数据报的影响。 为此,我使用带有SO_SNDBUF选项的setsockopt函数,我试图将缓冲区大小设置为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在设置时会使内核中的值加倍,并在查询时返回doubled值: 了解set / getsockopt SO_SNDBUF

有没有办法减少套接字发送缓冲区大小的最小下限? 例如,将其设置为64字节?

1 个回复

最小缓冲区大小是内核的函数。 选项SO_SNDBUF的Linux文档有这样的说法:

以字节为单位设置或获取最大套接字发送缓冲区。 当使用setsockopt(2)设置时,内核将此值加倍(以便为簿记开销留出空间),并且getsockopt(2)返回此doubled值。 默认值由/ proc / sys / net / core / wmem_default文件设置,最大允许值由/ proc / sys / net / core / wmem_max文件设置。 此选项的最小(加倍)值为2048。

(socket(7)manpage)

细节可能因系统而异,但是

  1. 这解释了你看到的加倍 - 缓冲区的输出字节容量是你设置的大小,但内核保留并报告两倍的空间。
  2. 至少在Linux上,你不能像你想要的那样设置一个小的缓冲区。 我猜想其他系统会有相同数量级的约束。
2 Windows中套接字发送缓冲区的大小是多少?

根据我的理解,每个套接字都与两个缓冲区,一个发送缓冲区和一个接收缓冲区相关联,所以当我调用send()函数时,发生的事情是要发送的数据将放入发送缓冲区,它是Windows现在负责将此发送缓冲区的内容发送到另一端。 在阻塞套接字中, send()函数在提供给它的整个数据放入发送缓冲区之前不会 ...

3 套接字接收缓冲区大小

有没有办法在c#中确定TCPIP套接字的接收缓冲区大小。 我正在向服务器发送一条消息,并期待一个我不确定接收缓冲区大小的响应。 ...

4 套接字自动缓冲区大小

我正在尝试制作C#套接字客户端,但是当我使用256创建缓冲区大小时 我错过了一些接收到的缓冲区,并开始作为单独的缓冲区数组接收,如果我创建了它,例如1000缓冲区大小,如果我收到的是小尺寸缓冲区,我浪费了太多内存,有没有办法使缓冲区大小汽车? 这是我用于连接回叫和接听回叫的代码 ...

5 Selenium-rc:有没有办法发送请求缓冲区

可以说我有一个链接列表,想随机单击一个链接: 这不是最聪明的方法(如果您有更好的解决方案,请告诉我),但是我目前正在做的(大致)是: 该解决方案的主要问题是它向硒发送了许多请求。 我的问题是:是否可以将所有这些请求保存在缓冲区中并立即发送? ...

6 执行 HTTP POST 请求时指定套接字发送缓冲区大小

一些背景:我正在使用遗留代码,并尝试通过 HTTP 表单(POST 请求)将二进制文件(~2MB)上传到嵌入式 microhttpd Web 服务器。 最近,我注意到 Windows 10 机器的上传速度明显慢于非 Windows 10 机器:上传将一次发送少量字节(每个约 6-7 个约 1500 ...

7 netperf套接字大小与为发送/接收呼叫设置的缓冲区?

当我尝试使用netperf实现基准测试软件时,我碰巧阅读了它的手册。 我在哪里得到这个查询 在特定于TCP_STREAM的测试中,有一个选项提及-s和-S分别指定本地(netperf客户端)和远程(netperf服务器)套接字缓冲区的大小。 这是常规的BSD插槽大小吗? 还有一个选项可以指定本地发送 ...

9 有没有办法刷新 SSL 写缓冲区

我已经使用 OpenSSL API 编写了一个 SSL 客户端来与一个 SSL 服务器进行交互。 在 OpenSSL 站点中,我了解到在写入一些数据后需要刷新写入缓冲区。 我在客户端程序中使用 SSL_Write 和 SSL_Read。 由于 OpenSSL 站点建议我尝试使用 BIO_flush( ...

2012-10-31 09:45:40 2 7460   openssl
10 有没有办法通过 OpenCV VideoCapture 访问图像缓冲区?

由于某些原因,我需要通过 OpenCV 的 VideoCapture 从相机直接访问图像缓冲区,但我找不到方法。 为了更清楚,我想在将数据检索到cv::Mat之前访问来自cv::VideoCapture::grab()的数据。 我在这里检查 OpenCV 源代码,似乎 OpenCV 在输出帧之前自 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM