news 2026/4/3 3:16:32

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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(不同内核可能略有差异)。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/14 16:21:31

数据中台建设中的成本优化:大数据平台降本增效实践

数据中台不“烧钱”&#xff1a;大数据平台降本增效的实战方法论 引言&#xff1a;你是不是也在为数据中台的“账单”头疼&#xff1f; 上个月和一位零售企业的数据总监聊天&#xff0c;他的吐槽让我瞬间共鸣&#xff1a; 年初刚花200万扩容了Hadoop集群&#xff0c;结果监控…

作者头像 李华
网站建设 2026/4/1 14:03:04

Index十年演进(2015–2025)

Index十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年Index还是“手工规则小样本标注单一任务分类”的浅层时代&#xff0c;2025年已进化成“万亿级多模态VLA统一Index实时意图级检索量子鲁棒自进化全域社交/具身知识索引”的普惠智能时代&#xff…

作者头像 李华
网站建设 2026/3/31 11:34:04

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

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

作者头像 李华
网站建设 2026/4/1 11:16:28

土木工程生就业难?靠远程工作,我找到了高薪稳定工作

作为2025届土木工程毕业生&#xff0c;我曾和无数同专业同学一样陷入就业焦虑&#xff1a;校招时&#xff0c;房企裁员缩招、施工单位岗位缩减&#xff0c;好不容易拿到的几个offer不是需要常年驻场偏远工地&#xff0c;就是薪资微薄且晋升渺茫&#xff1b;身边不少同学要么被迫…

作者头像 李华
网站建设 2026/3/16 11:43:38

HY-MT1.5镜像启动慢?SSD加速部署优化实战技巧

HY-MT1.5镜像启动慢&#xff1f;SSD加速部署优化实战技巧 1. 背景与问题提出 随着多语言内容在全球范围内的快速传播&#xff0c;高质量、低延迟的翻译模型成为智能硬件、跨境服务和实时通信系统的核心组件。腾讯近期开源的混元翻译大模型 HY-MT1.5 系列&#xff0c;包含两个主…

作者头像 李华
网站建设 2026/2/26 10:09:15

HY-MT1.5-1.8B能耗比实测:边缘AI设备最佳适配模型

HY-MT1.5-1.8B能耗比实测&#xff1a;边缘AI设备最佳适配模型 1. 引言&#xff1a;为何关注边缘端翻译模型的能效平衡&#xff1f; 随着多语言交流需求在智能终端、移动应用和物联网设备中的快速增长&#xff0c;实时翻译能力正逐步从“云端依赖”向“本地化部署”迁移。然而&…

作者头像 李华