Linux 网络编程必知:setsockopt、缓冲区、地址重用、多播端口一次讲透

Linux 网络编程必知:setsockopt、缓冲区、地址重用、多播端口一次讲透

关键词:setsockopt、SO_RECVBUF、SO_SNDBUF、SO_REUSEADDR、多播端口、UDP 组播、TCP_NODELAY

一、setsockopt 到底能改什么?

setsockopt只能改 内核套接字缓冲区 及相关行为,改不到 你read/recv时自己传的那块用户空间数组。

常见误区:把“内核接收缓冲区”和“用户空间 buf”混为一谈——两者不在一层。

缓冲区位置 控制方式 默认大小来源
内核接收缓冲区setsockopt(fd, SOL_SOCKET, SO_RCVBUF, …)/proc/sys/net/core/rmem_default
内核发送缓冲区setsockopt(fd, SOL_SOCKET, SO_SNDBUF, …)/proc/sys/net/core/wmem_default
用户空间缓冲区read/recv/recvfrom调用时你自己传的数组 代码里写多大就是多大

二、地址重用 SO_REUSEADDR 的真实作用

一句话:让新进程可以立刻bind到“刚刚被关闭、仍处于 TIME_WAIT 的同一 IP:端口”,重启服务不再报 “Address already in use”。

  • UDP:立竿见影,多播/广播接收器常用,无需等待。
  • TCP:仅解决 “TIME_WAIT 拖延复用”,不能 创建真正重复的四元组。

代码模板(TCP/UDP 通用):

intfd=socket(AF_INET,SOCK_STREAM,0);/* 或 SOCK_DGRAM */inton=1;setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));

三、多播(组播)到底该用哪个端口?

技术上 没有硬性限制,只要避开系统/已知服务端口即可。

推荐范围:1024–65535 里任意空闲 UDP 端口。

场景 常用端口示例
路由协议 224.0.0.5:89(OSPF)
车载、音视频 239.x.x.x + 30000 以上
局域网测试 8888、9999、22334

防火墙/云主机注意:安全组需放行 UDP 协议 + 你选定的端口;部分云厂商把 135、445、5900 等列为高危端口,避开即可。

四、Linux UDP 多播最小可运行示例

多播地址范围:224.0.0.0–239.255.255.255,本例用 224.1.1.1:8888。

  1. 发送端 multicast_send.c
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<unistd.h>#include<arpa/inet.h>#include<sys/socket.h>#defineMULTICAST_IP"224.1.1.1"#defineMULTICAST_PORT8888#defineBUF_SIZE1024intmain(void){intsock=socket(AF_INET,SOCK_DGRAM,0);if(sock<0){perror("socket");return-1;}structsockaddr_indst={.sin_family=AF_INET,.sin_port=htons(MULTICAST_PORT),.sin_addr.s_addr=inet_addr(MULTICAST_IP)};unsignedcharttl=2;/* 允许跨路由器 */setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl));charbuf[BUF_SIZE];while(fgets(buf,sizeof(buf),stdin)){sendto(sock,buf,strlen(buf),0,(structsockaddr*)&dst,sizeof(dst));if(strncmp(buf,"quit",4)==0)break;}close(sock);return0;}
  1. 接收端 multicast_recv.c
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<unistd.h>#include<arpa/inet.h>#include<sys/socket.h>#include<netinet/in.h>#defineMULTICAST_IP"224.1.1.1"#defineMULTICAST_PORT8888#defineBUF_SIZE1024intmain(void){intsock=socket(AF_INET,SOCK_DGRAM,0);if(sock<0){perror("socket");return-1;}intreuse=1;setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse));structsockaddr_inlocal={.sin_family=AF_INET,.sin_port=htons(MULTICAST_PORT),.sin_addr.s_addr=INADDR_ANY};if(bind(sock,(structsockaddr*)&local,sizeof(local))<0){perror("bind");return-1;}structip_mreqmreq={.imr_multiaddr.s_addr=inet_addr(MULTICAST_IP),.imr_interface.s_addr=INADDR_ANY};if(setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))<0){perror("IP_ADD_MEMBERSHIP");return-1;}charbuf[BUF_SIZE];structsockaddr_insender;socklen_tsender_len=sizeof(sender);while(1){ssize_tn=recvfrom(sock,buf,sizeof(buf)-1,0,(structsockaddr*)&sender,&sender_len);if(n<0){perror("recvfrom");break;}buf[n]=0;printf("recv from %s:%d %s",inet_ntoa(sender.sin_addr),ntohs(sender.sin_port),buf);if(strncmp(buf,"quit",4)==0)break;}setsockopt(sock,IPPROTO_IP,IP_DROP_MEMBERSHIP,&mreq,sizeof(mreq));close(sock);return0;}
  1. 编译与运行
gcc multicast_send.c-osend gcc multicast_recv.c-orecv# 终端 1./recv# 终端 2./send

同一网段可启动多个recv实例,都能收到数据包。

五、setsockopt 函数原型速查

intsetsockopt(intsockfd,intlevel,/* SOL_SOCKET / IPPROTO_IP / IPPROTO_TCP … */intoptname,/* SO_REUSEADDR / SO_RCVBUF / TCP_NODELAY … */constvoid*optval,socklen_toptlen);

示例:一次把地址重用、接收缓冲区、TCP_NODELAY 全设好

intfd=socket(AF_INET,SOCK_STREAM,0);inton=1;setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));intrcvbuf=64*1024;setsockopt(fd,SOL_SOCKET,SO_RCVBUF,&rcvbuf,sizeof(rcvbuf));setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,&on,sizeof(on));

注意:TCP_NODELAY仅限 TCP,UDP 会返回-1

六、Linux 默认接收缓冲区到底多大?

查看当前系统值:

cat/proc/sys/net/core/rmem_default# 常见输出:212992 (约 208 KB)

不调用SO_RCVBUF时,新建套接字的初始接收缓冲区 =rmem_default

现代主流发行版均为 208 KB(不同内核可能略有差异)。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1140923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.2 FileStream

1.FileStream1.FileStream FileStream操作的是字节数组, 读写文本需配合Encoding(如: UTF8)转换1).构造函数这是使用FileStream的第一步, 用于打开/创建文件并指定操作模式// 参数&#xff1a;文件路径、文件模式、文件访问权限、文件共享方式 FileStream fs new FileStream(&…

基于SpringBoot的仓库管理系统毕设源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于SpringBoot框架的仓库管理系统&#xff0c;以满足现代企业对高效、可靠、易用的仓库管理解决方案的需求。具体研究目的如下&#x…

Infra十年演进(2015–2025)

Infra十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年Infra还是“单机多卡手工脚本本地集群”的原始时代&#xff0c;2025年已进化成“万亿级多模态VLA大模型云原生训练量子加速自进化全域弹性无服务器秒级自愈分布式”的终极AI基础设施&#xff0c…

实战案例:汽车数字孪生车间的提示工程应用

从物理车间到数字孪生&#xff1a;提示工程如何让汽车制造“会思考”&#xff1f; 关键词 数字孪生车间、提示工程、AI智能制造、故障预测、生产优化、自然语言交互、数据闭环 摘要 当汽车制造车间从“物理实体”进化为“数字孪生”&#xff0c;如何让这个“虚拟双胞胎”不仅能…

嘉环科技携手 TDengine,助力某水务公司构建一体化融合平台

小T导读&#xff1a;在某水务公司水务物联网平台项目中&#xff0c;嘉环科技充分利用大数据、AIoT 等技术&#xff0c;构建统一物联网平台&#xff0c;实现数据的充分整合和高效、便捷、安全的集中式管理运维&#xff0c;平台通过集中管控全市水务设备&#xff0c;实现了水务公…

ControlNet十年演进(2015–2025)

ControlNet十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年ControlNet还“不存在”&#xff08;条件生成仅简单文本/类标签&#xff09;&#xff0c;2023年2月ControlNet正式诞生后仅2年半&#xff0c;已从“单条件Stable Diffusion附加控制”进化成…

吐血推荐专科生必用TOP8AI论文平台

吐血推荐专科生必用TOP8AI论文平台 2026年专科生必备AI论文平台测评解析 随着人工智能技术的不断进步&#xff0c;越来越多的学术辅助工具进入高校师生的视野&#xff0c;尤其对于专科生而言&#xff0c;论文写作往往面临时间紧张、资料查找困难、格式不规范等多重挑战。为了帮…

华为OD机试 - 整型数组按照个位数排序(Java 双机位C卷 100分)

华为OD机试 双机位C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的…

信创电话助手电话录音盒操作系统兼容性

一、国产 Linux 桌面操作系统&#xff08;仅支持桌面版&#xff0c;不支持服务器版&#xff09; ✅ 支持的操作系统 麒麟&#xff08;Kylin&#xff09;统信 UOSDeepin欧拉&#xff08;OpenEuler&#xff09;【注&#xff1a;仅限桌面发行版】 ✅ 系统要求 内核版本&#x…

当模型“知道自己在作弊”:Scheming 与 Reward Hacking 的技术解剖

当模型“知道自己在作弊”&#xff1a;Scheming & Reward Hacking 的技术解剖 问题重述&#xff1a;错误&#xff0c;还是欺骗&#xff1f; 之前已经写了几篇文章展开大模型在幻觉和诚实问题上的区别。 在工程实践中&#xff0c;我们常将模型错误归因为能力不足或知识缺…

HY-MT1.5开源社区贡献指南:模型改进与反馈提交实战

HY-MT1.5开源社区贡献指南&#xff1a;模型改进与反馈提交实战 随着多语言交流需求的不断增长&#xff0c;高质量翻译模型成为推动全球化信息流通的核心技术。腾讯近期开源了混元翻译大模型 1.5 版本&#xff08;HY-MT1.5&#xff09;&#xff0c;涵盖两个关键模型&#xff1a…

巴菲特的公司治理观点

巴菲特的公司治理观点 关键词:巴菲特、公司治理、股东价值、长期主义、管理层激励 摘要:本文深入探讨了巴菲特的公司治理观点。从背景介绍入手,阐述了研究巴菲特公司治理观点的目的、范围、预期读者等内容。详细剖析了巴菲特公司治理核心概念与联系,包括股东导向、管理层素…

吐血推荐9个AI论文写作软件,研究生轻松搞定毕业论文!

吐血推荐9个AI论文写作软件&#xff0c;研究生轻松搞定毕业论文&#xff01; AI 工具助力论文写作&#xff0c;研究生也能轻松应对 随着人工智能技术的不断发展&#xff0c;AI 工具在学术领域的应用越来越广泛。尤其是在论文写作过程中&#xff0c;AI 工具不仅能够显著降低 AIG…

springboot竞赛团队组建与管理系统的设计与实现

背景分析随着高校学科竞赛的普及和团队协作需求的增加&#xff0c;传统的人工管理方式面临效率低、信息分散、协同困难等问题。SpringBoot竞赛团队组建与管理系统通过技术手段解决以下痛点&#xff1a;信息碎片化&#xff1a;竞赛通知、团队成员信息、进度跟踪依赖线下沟通&…

Triton十年演进(2015–2025)

Triton十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年Triton还“不存在”&#xff08;GPU自定义算子靠手工CUDA专家&#xff09;&#xff0c;2025年Triton已进化成“OpenAI主导的Python级GPU内核语言全自动编译优化万亿模型训练/推理标配量子加速融…

1.线性switch case语句逆向特征

文章目录逆向实战&#xff1a;我是怎么从这段汇编一眼看出它是 switch&#xff0c;而不是一串 if/else1. 先把源码和目标放在脑子里2. 第一眼看到的异常感&#xff1a;**比较链太“整齐”了**2.1 同一个变量&#xff0c;被连续拿来和多个“干净的常量”比较3. 再往下看&#xf…

实时数据异常检测模块

污水监控 环境监测 云平台半夜三点&#xff0c;我盯着电脑屏幕上的折线图突然开始剧烈波动——污水厂进水口的COD浓度在十分钟内从200mg/L飙升到1200mg/L。这不是普通的污染事件&#xff0c;系统自动触发警报的同时&#xff0c;Python脚本已经开始抓取周边企业排水数据。 def d…

HY-MT1.5-7B A/B测试:不同参数版本效果对比部署方案

HY-MT1.5-7B A/B测试&#xff1a;不同参数版本效果对比部署方案 1. 引言 随着多语言交流需求的不断增长&#xff0c;高质量、低延迟的翻译模型成为智能应用的核心组件。腾讯近期开源了混元翻译大模型1.5版本&#xff08;HY-MT1.5&#xff09;&#xff0c;包含两个关键模型&am…

实时日志分析:ELK Stack深度优化指南

实时日志分析&#xff1a;ELK Stack深度优化指南 引言 在DevOps、故障排查、用户行为分析等场景中&#xff0c;实时日志分析是企业IT系统的“神经中枢”。它能帮助团队快速定位问题&#xff08;比如服务器宕机、接口超时&#xff09;、监控系统状态&#xff08;比如CPU使用率、…

MoE(Mixture of Experts)架构十年演进(2015–2025)

MoE&#xff08;Mixture of Experts&#xff09;架构十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年MoE还是“理论复苏小规模手工专家路由”的学术时代&#xff0c;2025年已进化成“万亿级多模态VLA动态MoE意图级自适应专家量子加速自进化全域具身…