Socket缓冲区大小修改与系统设置

2023-05-16

 

每个Socket在Linux中都映射为一个文件,并与内核中两个缓冲区(读缓冲区、写缓冲区)相关联。

或者说,每个Socket拥有两个内核缓冲区。

有时,我们需要修改缓冲区的内核限制的最大值,使其符合我们的实际需求。

一、系统设置

复制代码


[jiang@localhost ~]$ uname -a
Linux localhost.localdomain 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[jiang@localhost ~]$ cat /proc/sys/net/core/rmem_max
124928
[jiang@localhost ~]$ cat /proc/sys/net/core/wmem_max
124928
[jiang@localhost ~]$ cat /proc/sys/net/core/rmem_default
124928
[jiang@localhost ~]$ cat /proc/sys/net/core/wmem_default
124928
  

复制代码

 

rmem_max:一个Socket的读缓冲区可由程序设置的最大值,单位字节;
wmem_max:一个Socket的写缓冲区可由程序设置的最大值,单位字节;
rmem_default:一个Socket的被创建出来时,默认的读缓冲区大小,单位字节;
wmem_default:一个Socket的被创建出来时,默认的写缓冲区大小,单位字节;

注:/proc是一个很特殊的文件系统,其并非真实存在于物理磁盘,而是当前系统运行状态的一个映射,存在于RAM中。

二、应用程序级修改缓冲区大小

我们可以在程序中动态地修改(通过setsockopt系统调用)持有的有效Socket的读写缓冲区大小。

复制代码


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>

int main(int argc, char **argv)
{
     if (argc != 2)
     {
         printf("Usage: %s $RCFBUFSIZE\n", argv[0]);
         goto error;
     }

    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
     if (sockfd < 0)
     {
         printf("create socket error=%d(%s)!!!\n", errno, strerror(errno));
         goto error;
     }

    // 查看系统默认的socket接收缓冲区大小
     int defRcvBufSize = -1;
     socklen_t optlen = sizeof(defRcvBufSize);
     if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &defRcvBufSize, &optlen) < 0)
     {
         printf("getsockopt error=%d(%s)!!!\n", errno, strerror(errno));
         goto error;
     }
     printf("OS default udp socket recv buff size is: %d\n", defRcvBufSize);

    // 按照执行参数设置UDP SOCKET接收缓冲区大小
     int rcvBufSize = atoi(argv[1]);
     if (rcvBufSize <= 0)
     {
         printf("rcvBufSize(%d) <= 0, error!!!\n", rcvBufSize);
         goto error;
     }
     printf("you want to set udp socket recv buff size to %d\n", rcvBufSize);
     optlen = sizeof(rcvBufSize);
     if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvBufSize, optlen) < 0)
     {
         printf("setsockopt error=%d(%s)!!!\n", errno, strerror(errno));
         goto error;
     }
     printf("set udp socket(%d) recv buff size to %d OK!!!\n", sockfd, rcvBufSize);

    // 查看当前UDP SOCKET接收缓冲区大小
     int curRcvBufSize = -1;
     optlen = sizeof(curRcvBufSize);
     if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &curRcvBufSize, &optlen) < 0)
     {
         printf("getsockopt error=%d(%s)!!!\n", errno, strerror(errno));
         goto error;
     }
     printf("OS current udp socket(%d) recv buff size is: %d\n", curRcvBufSize);

    close(sockfd);

    exit(0);

error:
     if (sockfd >= 0)
         close(sockfd);
     exit(1);
}  

复制代码

编译 && 运行:


[jiang@localhost ~]$ gcc -o main main.c
[jiang@localhost ~]$ ./main 1024
OS default udp socket recv buff size is: 124928
you want to set udp socket recv buff size to 1024
set udp socket(3) recv buff size to 1024 OK!!!
OS current udp socket(2280) recv buff size is: 2280  

我们通过setsockopt系统调用成功地修改了sock的接收缓冲区大小。

但是,代码级的修改缓冲区大小,不是万能的,其受限于系统配置。


[jiang@localhost ~]$ ./main 1048576
OS default udp socket recv buff size is: 124928
you want to set udp socket recv buff size to 1048576
set udp socket(3) recv buff size to 1048576 OK!!!
OS current udp socket(249856) recv buff size is: 249856  

可见,我们希望设置接收缓冲区大小为1024*1024B(1MB),但实际并未达到我们的效果,虽然setsockopt成功了!

我们可以通过修改系统运行时的配置(/proc),来动态地“释放权限”,让应用程序可以设置更大的内核读写缓冲区。

三、系统配置级修改缓冲区大小

复制代码


[jiang@localhost ~]$ su - root
Password: 
[root@localhost ~]# echo 262144 > /proc/sys/net/core/rmem_default
[root@localhost ~]# echo 1048576 > /proc/sys/net/core/rmem_max
[root@localhost ~]# logout
[jiang@localhost ~]$ cat /proc/sys/net/core/rmem_default
262144
[jiang@localhost ~]$ cat /proc/sys/net/core/rmem_max
1048576
[jiang@localhost ~]$ ./main 1048576
OS default udp socket recv buff size is: 262144
you want to set udp socket recv buff size to 1048576
set udp socket(3) recv buff size to 1048576 OK!!!
OS current udp socket(2097152) recv buff size is: 2097152  

 

我们在root下,修改了系统运行时的配置:


/proc/sys/net/core/rmem_default
/proc/sys/net/core/rmem_max  

我们设置读缓冲区默认值为256KB,最大值为1MB。

程序运行时,我们希望设置读缓冲区为1MB。

通过输出信息,我们可以验证,修改/proc中的配置文件,我们使得一个socket默认的读缓冲区为256KB,读缓冲区最大值为1MB。

setsockopt系统调用级设置受限于系统运行时配置,可以通过修改系统配置,使得程序设置更大的读写缓冲区。
需要注意的两点:

1.)当系统关机重启时,对/proc的修改,是否依然存在?

不会。这就比较重要,若服务器由于异常宕机,重启后失去了原有的设置,就有可能导致接收缓冲区过小,出现UDP丢包的可能。

2.)为什么我通过setsockopt设置读缓冲区值为rcvBufSize,但实际getsockopt获取的读缓冲区大小是2*rcvBufSize?

这个是和源码有关系。

(引用自:https://blog.csdn.net/liuguanghui1988/article/details/53375269)

 


case SO_SNDBUF:

if (val > sysctl_wmem_max)

val = sysctl_wmem_max;

if ((val * 2 ) < SOCK_MIN_SNDBUF)

sk->sk_sndbuf = SOCK_MIN_SNDBUF;

else

sk->sk_sndbuf = val * 2 ;  

 

系统这么做,猜测可能是由于UDP解包封包需要的额外的空间。

所以,我称r/wmem_max为:可由程序设置的缓冲区最大值。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Socket缓冲区大小修改与系统设置 的相关文章

  • mpv播放器键盘快捷键

    作为个人认为最好用的播放器之一的MPV播放器 xff0c 其开源 xff0c 体积小 xff0c 支持的格式多样等等非常优秀的功能 但其中也有部分麻烦的地方 xff0c 因为功能太过强大 xff0c 导致不知道某些功能的快捷键是什么 xff
  • Navicat Linux无限试用

    安装 本人用的Arch xff0c 一句话 xff08 邪教大法 xff09 yaourt navicat121 premium 找过好几个注册码发现都不能用 xff0c 注册码生成器都是Windows平台的 xff0c Linux下没办法
  • Android AIDL进程间通信的简单使用

    Android AIDL进程间通信的简单使用 https github com xueqiya AIDL git
  • 算法分析:求最近点对问题(c++)

    算法分析 求最近点对问题 c 1 准备部分 对于最近点问题 需要将问题代码化 所以要先创建一个点类 来使得计算使用时候更加方面 class Points span class token comment 点类 span span class
  • chromium for android 源码编译

    官方文档 https chromium googlesource com chromium src 43 master docs android build instructions md 准备 Ubuntu xff08 其他linux也可
  • ChromeTabbedActivity启动初始化

    ChromeLauncherActivity 启动ChromeTabbedActivity ChromeTabbedActivity ChromeTabbedActivity extends ChromeActivity ChromeAct
  • linux http代理

    linux设置代理 1 编辑profile文件 vi etc profile 2 添加代理 有用户名和密码 xff1a export http proxy 61 http 用户名 密码 64 ip 端口号 export https prox
  • Flutter urlencode转换

    Uri encodeComponent url To encode url Uri decodeComponent encodedUrl To decode url
  • Flutter 中的key、LocalKey、GlobalKey等等

    key之间的关系 key 64 immutable abstract class Key const factory Key String value 61 ValueKey lt String gt 64 protected const
  • 小鹤双拼皮肤

    手机输入法皮肤
  • Arch 安装 deb

    安装 debtap yaourt S debtap 也应该安装bash xff0c binutils xff0c pkgfile 和 fakeroot 依赖包 创建 更新 pkgfile 和 debtap 数据库 sudo debtap u
  • interp2

    原 Matlab 图像插值函数interp2理解 2016年05月10日 23 47 35 Ian ma 阅读数 xff1a 13363 lt div gt lt div class 61 34 operating 34 gt lt div
  • 远程登录windows桌面蓝屏的解决方法

    1 windows 43 r xff0c 打开运行 xff0c 输入mstsc xff0c 回车 xff0c 输入对应的服务器登录 2 登陆后出现蓝屏 xff0c 无法显示桌面 xff0c Ctrl 43 Alt 43 End键 xff0c
  • ALM/QC11.0在win8/IE11下无法浏览

    页面显示要求安装插件 xff0c 安装ALM Platform Loader 11 msi 失败 xff0c 提示 cannot be installed on windows xp vista windows7 x64 UAC已关闭 xf
  • opengl实现俄罗斯方块

    include 34 Angel h 34 pragma comment lib 34 glew32 lib 34 include lt cstdlib gt include lt iostream gt include lt time h
  • Mysql学习日记:L20-insert(DML)

    目录 一 insert语法格式 二 insert插入日期 2 1 str to date函数 2 2 date format函数 2 3 date和datetime的区别 三 insert一次插入多条语句 一 insert语法格式 语法格式
  • 解决debian服务器中文显示乱码问题

    由于安装debian选择语言时选择了简体中文安装 xff0c 但内核没有中文字库 xff0c 导致某些字符显示为乱码 xff08 菱形 xff0c 方块 xff09 解决办法 xff1a 普通用户如果没有设置sudo权限 xff0c 首先切
  • 201609-3炉石传说——CCF试题2016年9月第三题

    问题描述 炉石传说 xff1a 魔兽英雄传 xff08 Hearthstone Heroes of Warcraft xff0c 简称炉石传说 xff09 是暴雪娱乐开发的一款集换式卡牌游戏 xff08 如下图所示 xff09 游戏在一个战
  • C语言打印宏定义/枚举变量 名称和变量值

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • File size exceeds....(文件大小超过限制处理)

    File size exceeds configured limit 2560000 Code insight features not available 原因 xff1a IDEA对能关联的文件大小做了限制 xff0c 主要是为了保护内

随机推荐

  • 第一章-介绍

    介绍 一般建议 什么是游戏引擎 什么是Godot 下载Godot 其他安装方法 Godot UI概述 Project Manager 选择文件名 编辑器窗口 关于节点和场景 Godot中的脚本 关于GDScript 总结 无论你是想要从事的
  • 安装ubuntu系统,报错WslRegisterDistribution failed with error: 0x8007019e

    在windows应用商店安装ubuntu系统 xff0c 报错WslRegisterDistribution failed with error 0x8007019e 1 报错 xff1a Installing this may take
  • 安装Anaconda后,发现文件缺少大量文件

    电脑崩溃修复后 xff0c 使用的Anaconda 居然也崩了 xff0c 重新安装后丢失很多文件 xff0c 然后就是重复的卸载 安装 卸载 xff0c 还是不行 xff0c 我的心态也快要崩了 xff0c 哎 xff0c 就下面图示一样
  • AutoMapping 9 使用入门

    AutoMapping 9语法更改 using AutoMapper using System using System Collections Generic using System Linq using System Text usi
  • Oracle在线练习

    oracle官方的服务 Live SQL xff0c 挺方便的 需要注册一个帐号 访问地址 xff1a https livesql oracle com apex livesql file index html https livesql
  • pyinstaller 打包取消命令行窗口弹出

    pyinstaller F w icon 61 photo ico test py w可以使得exe运行时不弹窗
  • c#有参构造函数中怎么调用其无参构造函数

    class A public A public A int A this 当A a 61 new A 1 时 会先调用无参数的构造函数 在调用有参数那个
  • 使用npm的一些问题

    npm切换为国内的数据源 npm config set registry https span class token punctuation span span class token operator span span class t
  • Caliburn.Micro将枚举 绑定到ComboBox

    参考 https stackoverflow com questions 47480725 caliburn micro enum binding in combobox 上面的文章详细地说明了CM的绑定原理和操作步骤 xff0c 但我需要
  • WPF DataGrid 获取多选项目

    解决方案 xff1a 先附上地址 xff1a https stackoverflow com questions 9880589 bind to selecteditems from datagrid or listbox in mvvm
  • 记一次netcore 3.1 发布失败

    VS版本 xff1a 2019 16 8 5 使用框架 xff1a netcore3 1 问题描述 xff1a 项目可以正常生成 xff0c 但部署模式为独立时 xff0c 不能发布 xff0c 部署模式为依赖框架 xff0c 可以发布 报
  • 在.NET中使用COM组件

    在 NET中使用COM组件 文章目录 在 NET中使用COM组件早期绑定COM对象为COM类型库生成互操作程序集使用COM组件 后期绑定COM对象通过与非托管代码互操作创建COM对象通过平台调用创建COM对象通过C 43 43 Intero
  • Go语言生成dll

    GO语言生成dll 环境dll代码编译调试 环境 操作系统 xff1a win7 64位 go版本 xff1a 1 17 gcc版本 xff1a Thread model win32 gcc version 8 1 0 x86 64 win
  • 腾讯云轻量应用服务器配置https踩坑

    服务器里有许多应用模板 xff0c 这些应用装上应可以运行 xff0c 非常方便 xff0c 但配置https踩了许多坑 xff0c 记录一下吧 以WordPress 腾讯云插件版为例 xff0c 应用信息如下 SSL证书安装 点击Ngin
  • 微信支付宝扫码支付简介

    微信平台 支付模式 付款码支付Native支付JSAPI支付APP支付H5支付小程序支付 各种模式的定义可以查看微信官方文档 这里应用Native支付 xff0c 它是商户系统按微信支付协议生成支付二维码 xff0c 用户再用微信 扫一扫
  • C++十六进制转十进制

    方法一 span class token macro property span class token directive hash span span class token directive keyword include span
  • Apache2 配置 HTTPS

    文章目录 自签名 CA 证书服务器部署 HTTPS客户端验证Https 原理 常见问题参考 自签名 CA 证书 生成密钥 使用 128 位的 RSA 算法生成的密钥 xff0c 4096 是密钥的长度 xff0c 建议使用 4096 或以上
  • WPF .Net5 caliburnmicro初始化

    貌似nuget没有提供 Net5的Starter模版 xff0c 因此记录一下初始化工程的流程 下载Cal Nuget 搜索Caliburn 下载4 0 173版本 向工程添加ViewModels和Views文件夹 添加ViewModel
  • MSF手机渗透实验(未成功)(CVE-2019-2215 Binder UA)

    1 前言 最近想利用metasploit对手机进行依次渗透实验 通过查看最近三年的安卓漏洞 xff0c 我对CVE 2019 2215这个漏洞很感兴趣 幸运的是 xff0c metasploit里就有这个漏洞的攻击payload xff0c
  • Socket缓冲区大小修改与系统设置

    每个Socket在Linux中都映射为一个文件 xff0c 并与内核中两个缓冲区 xff08 读缓冲区 写缓冲区 xff09 相关联 或者说 xff0c 每个Socket拥有两个内核缓冲区 有时 xff0c 我们需要修改缓冲区的内核限制的最