套接字属性的获取与设置
文章目录套接字属性套接字选项的核心级别SOL_SOCKET的常用选项IPPROTO_IP的常用选项核心函数参数返回值应用场景demo套接字属性套接字选项即套接字属性用于对套接字的行为、功能进行精细化控制选项的操作分为获取和设置部分选项仅可获取如套接字状态、类型部分选项既可获取也可设置如缓冲区大小、保活机制选项按协议 / 作用范围划分不同级别不同级别下包含专属的选项操作时需指定对应级别套接字选项的核心级别级别是选项的作用域标识操作选项时必须指定核心常用级别及作用如下级别作用范围适用场景SOL_SOCKET套接字本身通用级别所有类型套接字的基础属性控制IPPROTO_IPIPv4 协议层IPv4 相关的网络属性配置IPPROTO_IPV6IPv6 协议层IPv6 相关的网络属性配置IPPROTO_TCPTCP 协议流式套接字TCP 专属属性控制IPPROTO_UDPUDP 协议数据报套接字UDP 专属属性控制其他如 SOL_LRLMP特定协议如 IrDA小众协议的专属配置SOL_SOCKET的常用选项最常用的基础级别包含套接字的核心通用属性重点选项如下区分获取 / 设置权限选项名说明操作权限核心用途SO_ACCEPTCONN套接字是否处于监听状态仅获取判断 listen 是否调用成功SO_BROADCAST允许发送广播数据获取 / 设置UDP 广播通信开启SO_KEEPALIVE保活连接获取 / 设置TCP 长连接保活检测断连SO_LINGER延迟关闭连接获取 / 设置控制 close 时的连接关闭行为SO_RCVBUF/SO_SNDBUF接收 / 发送缓冲区大小获取 / 设置调整套接字读写缓冲区优化 I/OSO_REUSEADDR允许重用本地地址和端口获取 / 设置解决端口占用问题如重启服务SO_TYPE获得套接字类型仅获取判断是 TCPSOCK_STREAM/UDPSOCK_DGRAMSO_ERROR获得套接字错误码仅获取排查套接字运行中的错误IPPROTO_IP的常用选项针对 IPv4 协议的专属配置常用选项选项名说明操作权限IP_ADD_MEMBERSHIP加入多播组仅设置IP_OPTIONS设置 / 获取 IP 头部选项获取 / 设置IP_HDRINCL自定义 IP 头部原始套接字获取 / 设置IP_TTL设置 / 获取 IP 生存时间获取 / 设置核心函数#includesys/socket.h//获取选项getsockoptintgetsockopt(intsockfd,intlevel,intoptname,void*optval,socklen_t*optlen);//设置选项setsockoptintsetsockopt(intsockfd,intlevel,intoptname,constvoid*optval,socklen_toptlen);参数参数名类型作用sockfdint要操作的套接字描述符socket 创建的返回值levelint选项的级别如 SOL_SOCKET、IPPROTO_IPoptnameint要操作的具体选项名如 SO_REUSEADDR、IP_TTLoptvalvoid*存放选项值的缓冲区getsockopt内核将选项值写入该缓冲区setsockopt将待设置的值传入内核optlensocklen_t*getsockopt传入缓冲区大小返回实际读取的大小setsockopt直接传入缓冲区的实际大小非指针返回值成功返回0失败返回-1错误码存入errno常见错误码EBADF无效的套接字描述符EINVAL未知的级别 / 选项名ENOTSOCK描述符不是套接字是普通文件 / 设备ENOPROTOOPT协议不支持该选项应用场景服务端重启时设置SO_REUSEADDR解决端口占用问题需在bind前设置否则端口重用失效是服务端开发的必设选项高并发 / 大流量场景调整SO_RCVBUF/SO_SNDBUF扩大读写缓冲区减少 I/O 次数TCP 长连接如 IM、物联网设置SO_KEEPALIVE开启保活机制自动检测断连UDP 广播通信设置SO_BROADCAST允许发送广播包排查问题时通过SO_ERROR获取套接字错误码通过SO_TYPE判断套接字类型多播开发时通过IP_ADD_MEMBERSHIP让套接字加入多播组demo#ifndef_NET_H_#define_NET_H_#includestdio.h#includestdlib.h#includesys/socket.h#includenetinet/in.h#includenetinet/tcp.h#includearpa/inet.h#includeunistd.h#includestrings.h#includeerrno.htypedefstructsockaddrAddr;typedefstructsockaddr_inAddr_in;#defineBACKLOG5#defineErrExit(msg)do{perror(msg);exit(EXIT_FAILURE);}while(0)voidArgment(intargc,char*argv[]);intCreateSocket(char*argv[]);intDataHandle(intfd);#endif#includenet.hvoidArgment(intargc,char*argv[]){if(argc3){fprintf(stderr,%saddrport\n,argv[0]);exit(0);}}intCreateSocket(char*argv[]){/*创建套接字*/intfdsocket(AF_INET,SOCK_STREAM,0);if(fd0)ErrExit(socket);/*允许地址快速重用*/intflag1;if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,flag,sizeof(flag)))perror(setsockopt);/*设置通信结构体*/Addr_in addr;bzero(addr,sizeof(addr));addr.sin_familyAF_INET;addr.sin_porthtons(atoi(argv[2]));/*绑定通信结构体*/if(bind(fd,(Addr*)addr,sizeof(Addr_in)))ErrExit(bind);/*设置套接字为监听模式*/if(listen(fd,BACKLOG))ErrExit(listen);returnfd;}intDataHandle(intfd){charbuf[BUFSIZ]{};Addr_in peeraddr;socklen_tpeerlensizeof(Addr_in);if(getpeername(fd,(Addr*)peeraddr,peerlen))perror(getpeername);intretrecv(fd,buf,BUFSIZ,0);if(ret0)perror(recv);if(ret0){printf([%s:%d]data: %s\n,inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port),buf);}returnret;}#includenet.h#includesys/select.h#defineMAX_SOCK_FD1024voidsetKeepAlive(intsockfd,intattr_on,socklen_tidle_time,socklen_tinterval,socklen_tcnt){setsockopt(sockfd,SOL_SOCKET,SO_KEEPALIVE,(constchar*)attr_on,sizeof(attr_on));setsockopt(sockfd,SOL_TCP,TCP_KEEPIDLE,(constchar*)idle_time,sizeof(idle_time));setsockopt(sockfd,SOL_TCP,TCP_KEEPINTVL,(constchar*)interval,sizeof(interval));setsockopt(sockfd,SOL_TCP,TCP_KEEPCNT,(constchar*)cnt,sizeof(cnt));}intmain(intargc,char*argv[]){inti,ret,fd,newfd;fd_set set,tmpset;Addr_in clientaddr;socklen_tclientlensizeof(Addr_in);/*检查参数小于3个 直接退出进程*/Argment(argc,argv);/*创建已设置监听模式的套接字*/fdCreateSocket(argv);FD_ZERO(set);FD_ZERO(tmpset);FD_SET(fd,set);while(1){tmpsetset;if((retselect(MAX_SOCK_FD,tmpset,NULL,NULL,NULL))0){perror(select);getchar();}if(FD_ISSET(fd,tmpset)){/*接收客户端连接并生成新的文件描述符*/if((newfdaccept(fd,(Addr*)clientaddr,clientlen))0){perror(accept);getchar();}#if1intkeepAlive1;//设定KeepAliveintkeepIdle5;//开始首次KeepAlive探测前的TCP空闭时间intkeepInterval5;//两次KeepAlive探测间的时间间隔intkeepCount3;//判定断开前的KeepAlive探测次数setKeepAlive(newfd,keepAlive,keepIdle,keepInterval,keepCount);#endifprintf([%s:%d]已建立连接\n,inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));FD_SET(newfd,set);}else{//处理客户端数据for(ifd1;iMAX_SOCK_FD;i){if(FD_ISSET(i,tmpset)){if(DataHandle(i)0){if(getpeername(i,(Addr*)clientaddr,clientlen))perror(getpeername);printf([%s:%d]断开连接\n,inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));FD_CLR(i,set);close(i);}}}}}close(fd);return0;}

相关新闻

ChatTTS案例实战:如何通过语音合成技术提升客服系统效率

ChatTTS案例实战:如何通过语音合成技术提升客服系统效率

最近在优化客服系统时,遇到了一个老生常谈的问题:语音服务的效率瓶颈。传统的客服热线,要么依赖人工坐席,成本高且响应慢;要么使用早期TTS(文本转语音)技术,生成的语音机械、生硬&am…

2026/7/6 16:12:12 阅读更多 →
ChatTTS 生产环境部署实战:从零搭建到高可用架构

ChatTTS 生产环境部署实战:从零搭建到高可用架构

最近在项目中负责将 ChatTTS 服务从开发测试环境迁移到生产环境,整个过程踩了不少坑,也积累了一些经验。今天就来分享一下我们是如何从零开始,搭建一套高可用、高性能的 ChatTTS 生产服务架构的。希望能给有类似需求的同学一些参考。1. 背景与…

2026/7/8 12:29:22 阅读更多 →
AI生成专著秘籍!专业工具深度解读,快速产出学术佳作

AI生成专著秘籍!专业工具深度解读,快速产出学术佳作

学术专著的主要价值在于其内容的系统性和逻辑严谨性,但这也是写作中最难解决的问题之一。与期刊论文只关注单个问题不同,专著需要建立一个包含绪论、理论基础、核心研究、应用拓展和结论的完整架构。各章节之间需要层层递进、紧密联系,既不能…

2026/7/7 15:05:45 阅读更多 →

最新新闻

C-NCAP 2024版 AEB/LKA测试:10大误触发场景与3项新增法规解读

C-NCAP 2024版 AEB/LKA测试:10大误触发场景与3项新增法规解读

C-NCAP 2024版AEB/LKA测试:10大误触发场景与3项新增法规深度解析 随着智能驾驶技术的快速发展,AEB(自动紧急制动)和LKA(车道保持辅助)系统已成为现代车辆安全配置的核心组成部分。2024版C-NCAP规程对这两大…

2026/7/8 15:29:48 阅读更多 →
memwatch揭秘:轻量级内存调试神器如何精准捕捉内存泄漏与损坏?

memwatch揭秘:轻量级内存调试神器如何精准捕捉内存泄漏与损坏?

memwatch揭秘:轻量级内存调试神器如何精准捕捉内存泄漏与损坏? 【免费下载链接】memwatch a lightweight debugging tool that can tolerant memory leak and corruption detection. 项目地址: https://gitcode.com/openeuler/memwatch 前往项目官…

2026/7/8 15:29:48 阅读更多 →
tcas-cli安全应用指南:保护你的分布式系统免受攻击的终极方案

tcas-cli安全应用指南:保护你的分布式系统免受攻击的终极方案

tcas-cli安全应用指南:保护你的分布式系统免受攻击的终极方案 【免费下载链接】tcas-cli the user client of the trust cluster attestation server 项目地址: https://gitcode.com/openeuler/tcas-cli 前往项目官网免费下载:https://ar.openeul…

2026/7/8 15:29:48 阅读更多 →
gala-spider核心组件揭秘:拓扑图存储与根因定位原理解析

gala-spider核心组件揭秘:拓扑图存储与根因定位原理解析

gala-spider核心组件揭秘:拓扑图存储与根因定位原理解析 【免费下载链接】gala-spider An OS-level topology awareness service and a cause inference service. 项目地址: https://gitcode.com/openeuler/gala-spider 前往项目官网免费下载:htt…

2026/7/8 15:23:45 阅读更多 →
2026迪庆黄金回收白银回收铂金回收市民首选无隐形扣费正规备案回收门店联系方式推荐

2026迪庆黄金回收白银回收铂金回收市民首选无隐形扣费正规备案回收门店联系方式推荐

2026迪庆黄金白银铂金回收实测榜单|公安工商双备案无损测金无折旧费门店 迪庆香格里拉市区街头巷尾,贵金属回收店铺遍地丛生,行业套路层出不穷。不少市民变现时遭遇虚高报价、克扣损耗、未经同意熔金压价等问题。为帮助本地居民规避消费陷阱&…

2026/7/8 15:23:45 阅读更多 →
PilotGo-plugin-topology开发者手册:深入理解拓扑图生成器模块

PilotGo-plugin-topology开发者手册:深入理解拓扑图生成器模块

PilotGo-plugin-topology开发者手册:深入理解拓扑图生成器模块 【免费下载链接】PilotGo-plugin-topology system application architecture detection. 项目地址: https://gitcode.com/openeuler/PilotGo-plugin-topology 前往项目官网免费下载:…

2026/7/8 15:21:43 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻