当前位置: 首页 > 面试题库 >

了解set / getsockopt SO_SNDBUF大小加倍

强宾白
2023-03-14
问题内容

嗨,我有以下程序来检查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.
[...]


 类似资料:
  • 问题内容: 在python中,是没有重复元素的无序集合。但是,我无法理解它如何生成输出。 例如,考虑以下内容: 应该不是的输出是:?我在Python 2.6中尝试了以上两个。 问题答案: 正如您所说,集合是无序的。即使实现集合的一种方法是使用树,也可以使用哈希表来实现(这意味着按排序顺序获取键可能并不那么琐碎)。 如果您想对它们进行排序,则可以执行以下操作: 这将产生一个包含集合元素的排序列表。(

  • 如何获得Kafka单张唱片的大小? 有一些关于我为什么需要这个的说明。 这似乎不是在ConsumerRecord或RecordMetadata类上公开的serializedValueSize。我并不真正理解这个属性的价值,因为它与对消费者有用的消息的大小不匹配。serializedValueSize用于什么? 最大Poll.Records 在对poll()的单个调用中返回的最大记录数。 这并不存在

  • 问题内容: 密钥生成器已初始化为1024,所以为什么打印的大小为635和162? 问题答案: RSA密钥由模量和指数组成。密钥大小是指模数中的位。因此,即使没有任何编码开销,您也将需要超过128个字节来存储1024位密钥。 getEncoded()返回ASN.1 DER编码的对象。私钥甚至包含CRT参数,因此非常大。 要获取密钥大小,请执行以下操作, 这是相关的ASN.1对象,

  • 我读过关于减少捆绑大小的各种回答。首先,我想了解我的13MB捆绑包是怎么回事,所以我安装了Webpack捆绑包大小分析器。它生成了以下输出: 有几件事我不明白: 为什么react会以两种不同的尺寸出现两次? 为什么加起来不到13MB?(大约4.75MB) 这是否意味着我自己的代码只有4KB?(最后一行) 从这棵树可以理解如何保存KBs吗?我的意思是,例如,有没有一种方法可以只使用部分lodash,

  • 问题内容: 我已经读到 32位Windows上的最大堆大小是〜1.5GB,这是由于JVM需要连续的内存。有人可以解释“连续内存”的概念吗,为什么Windows上最多只有1.5GB? 其次,那么64位Windows上的最大堆大小是什么?为什么与32位Windows上可用的最大堆大小不同? 问题答案: 32位/ 64位部分与Java无关 事实证明,32位系统中的内存位置由32位无符号整数引用。这最多允

  • 我正在使用在我的客户端应用程序中执行以及 最大数据包大小限制也存在于中,即?但是我可以使用中的发送大于最大数据包大小的数据块 这是怎么运作的?这是因为是基于流的,负责在较低层创建数据包吗?有什么方法可以增加UDP中的最大数据包大小吗? 当我在客户端读取时,我从服务器端发送的UDP数据包的一些字节是否可能丢失?如果是,那么有没有办法只检测UDP客户端的损失?