linux c 端口复用,Linux C++ 网络编程学习系列(1)——端口复用实现
Linux C++ 网络编程学习系列(1)——端口复用实现
源码说明:
server1.cpp: 监听127.1:6666,功能是将收到的小写转大写
server2.cpp: 监听192.132:6666, 功能是接收数据, 将自己的数据从大写转小写, 把不是自己的数据转发给server1处理(判断方法是头三个字符是不是123)
1. 概要
起因: 由socket状态转换图可知, 主动关闭连接的一端都会有一个TIME_WAIT, 时间为2msl, 以确保对端收到最后一个ACK
影响: 如果是服务器端需要主动断开连接(例如网站更新等), 那么再次重启则需要浪费2msl时间, 为了减少这种时间开销, 因此有了端口复用
作用: 可以立马重启服务器, 而不必等待2msl, 且不会在bind的时候发生端口被占用的错误.
2. 核心代码
2.1 server1
//server1.cpp
#define LOCALIP "127.0.0.1"
#define PORT 6666
// 127.1:6666. startsock里面很简单,就是socket函数
startsock(fd_server, sock_server, LOCALIP, PORT);
opt = 1;
//设置为端口复用
Setsockopt(fd_server, SOL_SOCKET, SO_REUSEADDR, &opt, (socklen_t)sizeof(opt));
2.2 server2
//server2.cpp
#define LOCALIP "127.0.0.1"
#define PUBLICIP "192.168.153.132"
#define myflag "123"
#define PORT 6666
//这是连接server1, 也就是127.1:6666
startsock(fd_local, sock_local, LOCALIP, PORT);
opt = 1;
Setsockopt(fd_local, SOL_SOCKET, SO_REUSEADDR, &opt, (socklen_t)sizeof(opt));
//这是绑定192.132:6666的公网地址
startsock(fd_server, sock_server, PUBLICIP, PORT);
opt = 1;
Setsockopt(fd_server, SOL_SOCKET, SO_REUSEADDR, &opt, (socklen_t)sizeof(opt));
while (true) {
ret = (int)Read(fd_client, recvbuf, sizeof(recvbuf));
if (ret == 0) {
break;
}
strcpy(cmpstr, recvbuf);
cmpstr[strlen(myflag)] = '\0';
/*看看是不是我的数据包,如果不是,则交给127.1:6666端口处理*/
if (strcmp(cmpstr, myflag) != 0) {
printf("going to send to local\n");
Write(fd_local, recvbuf, strlen(recvbuf) + 1);//发给server1处理
Read(fd_local, sendbuf, sizeof(sendbuf)); //接收server1的返回结果
Write(fd_client, sendbuf, strlen(sendbuf) + 1);//把返回结果转给客户
continue;
}
//是我的,我来处理
printf("recv from %s:%d : string: %s\n",
inet_ntoa(clientinfo->addr.sin_addr),
ntohs(clientinfo->addr.sin_port), recvbuf);
handler(recvbuf + strlen(myflag), sendbuf);//函数功能: 将大写转为小写
ret = (int)Write(fd_client, sendbuf, strlen(sendbuf) + 1);
if (ret == 0) {
break;
}
}
参考网址
linux c 端口复用,Linux C++ 网络编程学习系列(1)——端口复用实现相关推荐
- linux 网络编程学习
linux 网络编程学习 Linux网络编程学习路线 - CTHON - 博客园 (cnblogs.com)
- [Linux网络编程学习笔记]索引
一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...
- 编程开发:Linux网络编程学习笔记
非常全面.通俗易懂.值得借鉴的Linux网络编程学习笔记.关键字:linux linux编程 网络编程 linux网络编程 下载地址:点我下载 特别说明:本资源收集于网络,版权归原作者及版权商所有,仅 ...
- 【Socket网络编程】0.socket TCP/UDP 可参考 【lx青萍之末】 的 【Linux网络编程 】系列博客
关于socket TCP/UDP 相关知识 可参考博主[ lx青萍之末] 的 [Linux网络编程 ]系列博客 https://blog.csdn.net/daaikuaichuan/category ...
- python网络编程学习笔记(二)
python网络编程学习(四) 多用途客户端协议 一.ftp 功能:上传下载文件,删除命名文件,建立删除目录,自动压缩,保存目录 1.代码: #coding=utf-8 '''连接远程ftp服务器,显 ...
- C++ 网络编程学习指南
C,C++网络编程学习简明指南 1. 扎实的C,C++基础知识 参考资料<C程序设计>,<C++ primer>. 2. TCP/IP协议 经典书是:W.Richard Ste ...
- C++网络编程学习:服务端多线程分离业务处理高负载
网络编程学习记录 使用的语言为C/C++ 源码支持的平台为:Windows / Linux 笔记一:建立基础TCP服务端/客户端 点我跳转 笔记二:网络数据报文的收发 点我跳转 笔记三:升级为se ...
- 谈一谈网络编程学习经验(06-08更新)
谈一谈网络编程学习经验 陈硕 giantchen@gmail.com blog.csdn.net/Solstice 2011-06-08 PDF 版下载:https://github.com/down ...
- C++网络编程学习:网络数据报文的收发
网络编程学习记录 使用的语言为C/C++ 源码支持的平台为:Windows 笔记一:建立基础TCP服务端/客户端 点我跳转 笔记二:网络数据报文的收发 点我跳转 笔记三:升级为select网络模型 ...
- java 网络编程学习笔记
java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...
最新文章
- python图片裁剪对比_Python自动抢视频红包,仅供学习!
- Network Namespace
- 虚拟机连接网络_Parallels Desktop 16教程PD16虚拟机共享网络和桥接网络设置方法
- python代码大全中文注释_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)...
- C#基础8:类的继承
- 用这些进行PDF翻译,双语对照、翻译后排版不变、还免费!
- matlab 齐次线性方程组,利用matlab求解RE中出现的齐次线性方程组
- 计算机故障检测与维修论文的绪论,论文--汽车故障的检测与维修
- 计算机科学与技术专业需要配电脑吗,大一新生开学,需要配台“电脑”吗?辅导员:这4个专业必须配...
- DIY 2U 服务器
- 通过Dreamweaver建立一个简单的网页音乐盒模型效果/css/h5/
- 帮助中国IT企业吃掉更多不会跳舞的大象
- 上海数据交易中心今天落户静安
- java中expand用法_Rxjs expand的用法分析
- 弘基笔记本拆机加内存条
- 判断两个事件是不是独立事件
- 小学计算机课程表说课稿,小学信息技术《创建课程表》说课稿
- 电子台账:教程目录及软件下载
- 【疫情下的中国网站】美国 脸书 Facebook公司 搞 中国网站了,各位 家人们 我该怎么办呢??
- 《我的兄弟叫顺溜之这尼玛也能翻盘》——HLOI2018游记
热门文章
- xp升级win7_微软正式停止支持Win7,部分用户拒绝升级系统,原因令人信服
- 如何在Windows11安装安卓子系统?
- Java反射专题笔记
- c语言获取随机数硬币问题,算法 – 从硬币中创建一个随机数生成器
- Consumer is not subscribed to any topics or assigned any partitions
- 【C++】日期类题目总结
- android远程主机强迫关闭了一个现有的连接,远程主机强迫关闭了一个现有的连接解决方法...
- 常用计算机 启动bios,常见电脑进入bios的方法
- 雅思两次7.5经验分享~希望帮你冲击雅思高分!
- aid learning安装应用_aid learning安装python