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)——端口复用实现相关推荐

  1. linux 网络编程学习

    linux 网络编程学习  Linux网络编程学习路线 - CTHON - 博客园 (cnblogs.com)

  2. [Linux网络编程学习笔记]索引

    一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...

  3. 编程开发:Linux网络编程学习笔记

    非常全面.通俗易懂.值得借鉴的Linux网络编程学习笔记.关键字:linux linux编程 网络编程 linux网络编程 下载地址:点我下载 特别说明:本资源收集于网络,版权归原作者及版权商所有,仅 ...

  4. 【Socket网络编程】0.socket TCP/UDP 可参考 【lx青萍之末】 的 【Linux网络编程 】系列博客

    关于socket TCP/UDP 相关知识 可参考博主[ lx青萍之末] 的 [Linux网络编程 ]系列博客 https://blog.csdn.net/daaikuaichuan/category ...

  5. python网络编程学习笔记(二)

    python网络编程学习(四) 多用途客户端协议 一.ftp 功能:上传下载文件,删除命名文件,建立删除目录,自动压缩,保存目录 1.代码: #coding=utf-8 '''连接远程ftp服务器,显 ...

  6. C++ 网络编程学习指南

    C,C++网络编程学习简明指南 1. 扎实的C,C++基础知识 参考资料<C程序设计>,<C++ primer>. 2. TCP/IP协议 经典书是:W.Richard Ste ...

  7. C++网络编程学习:服务端多线程分离业务处理高负载

    网络编程学习记录 使用的语言为C/C++ 源码支持的平台为:Windows / Linux 笔记一:建立基础TCP服务端/客户端  点我跳转 笔记二:网络数据报文的收发  点我跳转 笔记三:升级为se ...

  8. 谈一谈网络编程学习经验(06-08更新)

    谈一谈网络编程学习经验 陈硕 giantchen@gmail.com blog.csdn.net/Solstice 2011-06-08 PDF 版下载:https://github.com/down ...

  9. C++网络编程学习:网络数据报文的收发

    网络编程学习记录 使用的语言为C/C++ 源码支持的平台为:Windows 笔记一:建立基础TCP服务端/客户端  点我跳转 笔记二:网络数据报文的收发  点我跳转 笔记三:升级为select网络模型 ...

  10. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

最新文章

  1. python图片裁剪对比_Python自动抢视频红包,仅供学习!
  2. Network Namespace
  3. 虚拟机连接网络_Parallels Desktop 16教程PD16虚拟机共享网络和桥接网络设置方法
  4. python代码大全中文注释_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)...
  5. C#基础8:类的继承
  6. 用这些进行PDF翻译,双语对照、翻译后排版不变、还免费!
  7. matlab 齐次线性方程组,利用matlab求解RE中出现的齐次线性方程组
  8. 计算机故障检测与维修论文的绪论,论文--汽车故障的检测与维修
  9. 计算机科学与技术专业需要配电脑吗,大一新生开学,需要配台“电脑”吗?辅导员:这4个专业必须配...
  10. DIY 2U 服务器
  11. 通过Dreamweaver建立一个简单的网页音乐盒模型效果/css/h5/
  12. 帮助中国IT企业吃掉更多不会跳舞的大象
  13. 上海数据交易中心今天落户静安
  14. java中expand用法_Rxjs expand的用法分析
  15. 弘基笔记本拆机加内存条
  16. 判断两个事件是不是独立事件
  17. 小学计算机课程表说课稿,小学信息技术《创建课程表》说课稿
  18. 电子台账:教程目录及软件下载
  19. 【疫情下的中国网站】美国 脸书 Facebook公司 搞 中国网站了,各位 家人们 我该怎么办呢??
  20. 《我的兄弟叫顺溜之这尼玛也能翻盘》——HLOI2018游记

热门文章

  1. xp升级win7_微软正式停止支持Win7,部分用户拒绝升级系统,原因令人信服
  2. 如何在Windows11安装安卓子系统?
  3. Java反射专题笔记
  4. c语言获取随机数硬币问题,算法 – 从硬币中创建一个随机数生成器
  5. Consumer is not subscribed to any topics or assigned any partitions
  6. 【C++】日期类题目总结
  7. android远程主机强迫关闭了一个现有的连接,远程主机强迫关闭了一个现有的连接解决方法...
  8. 常用计算机 启动bios,常见电脑进入bios的方法
  9. 雅思两次7.5经验分享~希望帮你冲击雅思高分!
  10. aid learning安装应用_aid learning安装python