当前位置: 首页 > java >正文

网络编程之设置端口复用

首先来说一下为什么要设置端口复用,有些时候在调试服务器代码时势必会经常启动或结束服务器进程,这样就会出现当再次启动服务器时有可能会出现端口绑定失败的情况,造成这个情况的原因是由于你上次关闭服务器时有连接尚未断开等等其他原因,出现绑定失败也是系统的一个机制,当端口绑定的进程结束时系统会保留一段时间端口的绑定状态,等过一会再去启动服务器时就又可以绑定成功了。

也有一种方法,可以实现程序关闭时,立即启动也可以绑定成功,那就是设置端口复用,下面介绍了如何在Windows和Linux下设置端口复用

Windows/Linux下设置端口复用

Windows和Linux系统下都是使用setsockopt函数来设置端口复用

int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
// sockfd:要设置的文件描述符(包括套接字)
// level:级别,端口复用对应的是SOL_SOCKET
/* optname:选项的名字,下面是复用的选项SO_REUSEADDR:允许将套接字绑定到已在使用中的地址(地址复用)SO_REUSEPORT:允许将套接字绑定到已在使用中的端口(端口复用)**Windows下没有这个选项,设置SO_REUSEADDR可以达到同样的效果**
*/
// optval:设置optname选项的值,复用对应的都是int类型
// optlen:optval参数的大小
// 返回值:设置成功返回0,否则返回非0(Linux下返回-1,Windows下返回SOCKET_ERROR)

注意这个函数的调用要在套接字创建之后,绑定之前

示例代码

// 创建套接字
int fd = socket(PF_INET, SOCK_STREAM, 0);
if (fd < 0)
{std::cout << "网络初始化失败\n";return;
}int optval = 1;
// 设置端口复用【Windows下不用设置,因为没有SO_REUSEPORT】
int ret = setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval));
printf("%s(%d): ret=%d\n", __FILE__, __LINE__, ret);
// 设置地址复用
ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
printf("%s(%d): ret=%d\n", __FILE__, __LINE__, ret);sockaddr_in addr{}, clientAddr{};
socklen_t cliAddrLen = sizeof(clientAddr);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY; // INADDR_ANY所有的意思
addr.sin_port = htons(9556);       // htons主机到网络
// 绑定端口
if (bind(fd, (sockaddr *)&addr, sizeof(addr)) < 0)
{std::cout << "服务器绑定端口失败\n";close(fd);return;
}

到这里,windows和Linux下设置套接字端口复用就介绍完了

感谢观看学习,大佬们多多指点,愿明天的自己会感谢当下的努力!!!!

http://www.xdnf.cn/news/19210.html

相关文章:

  • C6.6:交流参量、电压增益、电流增益的学习
  • 迅睿CMS标签工具箱v1.1版本已更新
  • python 转偶数
  • React学习教程,从入门到精通, ReactJS - 特性:初学者的指南(4)
  • Linux829 shell:expect interact “ “ set
  • 解密PCI Express:现代计算机的“高速公路“是如何设计的?
  • W25Q64的写入
  • stm32单片机使用tb6612驱动编码器电机并测速的驱动代码详解—详细参考开发手册(可移植+开发手册)
  • 【系列02】端侧AI:构建与部署高效的本地化AI模型 第1章:为什么是端侧AI?
  • 音乐云测试报告
  • 【笔记】扩散模型(一二)U-ViT|Diffusion with Transformer
  • 大模型应用01——火山方舟大模型服务平台快速入门
  • 端到端推荐大模型OneSug颠覆电商查询推荐!端到端生成式框架降延迟43%,长尾场景突破传统瓶颈
  • 订餐后台管理系统 - day04退出登录与账号管理模块
  • layout版图设计学习笔记3_linux基础指令
  • YOLO v11 目标检测+关键点检测 实战记录
  • 3.1 DataStream API 编程模型
  • 矿用随钻测量现场应用中,最新的MEMS陀螺定向短节的优势是什么?
  • 如何禁止网站内容被复制:技术、策略与深度思考
  • 智慧园区安防技术一站式解决方案-云迈智慧园区管理系统
  • Ansible 常用模块详解文档
  • 龙迅#LT7642GX适用于4路HDMI2.1/DP/TPYE-C转HDMI+LVDS/MIPI混合开关应用,分辨率高达8K30HZ !
  • 2025 年邮件服务器软件推荐:国产化与智能化并重的选型指南
  • 【SOD】目标检测
  • 《WINDOWS 环境下32位汇编语言程序设计》第8章 通用对话框
  • 【dtcc】数据库 随笔
  • Python字符串转日期完全指南:从基础到企业级应用实践
  • 第三方软件测试:【深度解析SQL注入攻击原理和防御原理】
  • 从自定义日期类角度解析运算符重载,友元函数(friend)
  • Java中使用Spring Boot+Ollama实现本地AI的MCP接入