一、端口复用最常用的用途是:

1、防止服务器重启时之前绑定的端口还未释放;

2、程序突然退出而系统没有释放端口

二、相关API

#include <sys/types.h>
#include <sys/socket.h>
//设置套接字的属性(不仅仅能设置端口复用)
int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen);
参数:-sockfd:要操作的的文件描述符-level:级别 -SOL_SOCKET(端口复用级别)-optname:选项的名称-SO_REUSEADDR-SO_REUSEPOSE-optval:端口复用的值(整型)-1:可以复用-0:不可以复用-optlen:optval参数的大小
端口复用,设置的时机是在服务器绑定端口之前
例如
setsockopt();
bind();

三、查看网络相关信息的命令

netstat

参数:

-a 所有的socket

-p 显示正在使用的socket的程序的名称

-n 直接使用IP地址,而不是通过域名服务器

四、相关代码实现

  1 #include <stdio.h>2 #include <sys/types.h>3 #include <sys/socket.h>4 #include <arpa/inet.h>5 #include <stdlib.h>6 #include <unistd.h>7 #include <string.h>8 #include <signal.h>9 #include <wait.h>10 #include <errno.h>11 void recyChild(int argc)12 {13         while(1)14         {15                 int ret=waitpid(-1,NULL,WNOHANG);16                 if(ret==-1)17                 {18                         //所有进程都运行完了19                         break;20                 }21                 else if(ret==0)22                 {23                         //还有子进程活着24                         break;25                 }26                 else if(ret>0)27                 {28                         //还有子进程没有回收29                         printf("%d 进程被回收了\n",ret);30 31                 }32         }33 }34 int main()35 {36         //注册捕捉函数37         struct sigaction act;38         act.sa_flags=0;39         sigemptyset(&act.sa_mask);40         act.sa_handler=recyChild;41         sigaction(SIGCHLD,&act,NULL);42         //1、socket43         int lfd=socket(AF_INET,SOCK_STREAM,0);44         if(lfd==-1)45         {46                 perror("socket");47                 exit(-1);48         }49         int optval=1;50         setsockopt(lfd,SOL_SOCKET,SO_REUSEPORT,&optval,sizeof(optval));//复用端口51         //2、绑定bind52         struct sockaddr_in saddr;53         saddr.sin_family=AF_INET;54         saddr.sin_port=htons(9999);55         saddr.sin_addr.s_addr=INADDR_ANY;56         int ret=bind(lfd,(struct sockaddr *)&saddr,sizeof(saddr));57         if(ret==-1)58         {59                 perror("bind");60                 exit(-1);61         }62         //3、监听listen63         ret=listen(lfd,128);64         if(ret==-1)65         {66                 perror("listen");67                 exit(-1);68         }69         //4、循环接收accept70         while(1)71         {72                 struct sockaddr_in cliaddr;73                 int len=sizeof(cliaddr);74                 int num=accept(lfd,(struct sockaddr*)&cliaddr,&len);75                 if(num==-1)76                 {77                         if(errno==EINTR)78                         {79                                 continue;80                         }81                         perror("accept");82                         exit(-1);83                 }84 85                 //创建子进程86                 pid_t pid=fork();87                 if(pid==0)88                 {89                         char cliIP[16];90                         inet_ntop(AF_INET,&cliaddr.sin_addr.s_addr,cliIP,sizeof(cliIP));91                         unsigned short cliPort=ntohs(cliaddr.sin_port);92                         printf("client ip:%s,proc :%d\n",cliIP,cliPort);93 94                         //接收客户端发来的信息95                         char recvBuf[1024]={0};96                         while(1)97                         {98                                 int fd=read(num,&recvBuf,sizeof(recvBuf));99                                 if(fd==-1)
100                                 {
101                                         perror("read");
102                                         exit(-1);
103                                 }
104                                 else if(fd>0)
105                                 {
106                                         printf("recv data:%s\n",recvBuf);
107                                 }
108                                 else
109                                 {
110                                         printf("client closed...");
111                                 }
112                                 write(num,recvBuf,strlen(recvBuf));
113 //                              exit(0);
114                 //              close(fd);
115                         }
116                 }
117 //                              close(num);
118         }
119 //      close(ret);
120         return 0;
121 }

复用端口用在服务器,如果不使用复用端口的话,关闭服务器后立马再打开服务器的话会出现绑定错误“Address already in Use”,只能过1分钟后,所有文件符全部关闭后才能重新打开。而加上复用端口的话,就可以随时关闭和打开服务器了。

0基础学会 端口复用(内附C语言源码)相关推荐

  1. 0基础学会 守护进程(内附C语言源码)

    1.当父进程创建子进程的时候,默认子进程与父进程同属一个进程组,可以用kill -SIGKILL -进程组id(负数)来将整个进程组的id全部杀死. 2.组长进程不能创建会话. 3.setsid 函数 ...

  2. QQ自动点赞PHP源码_QQ好友批量回名片赞工具-QQ自动点赞附易语言源码V1.0电脑版PC端回赞-西西软件下载...

    QQ自动点赞附易语言源码是一款电脑版QQ好友批量回名片赞工具下载附易语言源码和导入QQ号码方,PC端QQ回赞和源码,然后打开软件导入QQ号码即可批量赞了,每个好友可以赞10次,同时附带了源码可以编译成 ...

  3. 远程服务器批量管理v1.6(附易语言源码)

    介绍: 使用第三方远程工具的时候,最担心的问题就是密码泄露,这款软件提供了易语言源代码,可以放心使用! 同时也给大家提供了成品软件,无需懂代码,无需编译,下载即用! 远程服务器管理工具成品+源码是一款 ...

  4. 备忘录模式详解 (附java语言源码)

    备忘录模式(Memento Pattern): 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保持该状态,这样以后就可以将该对象恢复到保存的状态.(Without violating ...

  5. c语言远控,远控鼠标!C语言简单编程:整舍友必备+附送实例源码!

    远控鼠标!C语言简单编程:整舍友必备+附送实例源码!-1.jpg (10.71 KB, 下载次数: 0) 2018-10-11 05:24 上传 关注<一碳科技>有更多干货等着你哦! 远控 ...

  6. 视频教程-影院在线售票云平台(仿猫眼电影,附SpringBoot项目源码)-Java

    影院在线售票云平台(仿猫眼电影,附SpringBoot项目源码) 19年软件开发经验,设计开发40多个大型软件,10年从事高等教育,主要为java系列课程,带你轻松进入java生涯. 赖国荣 ¥299 ...

  7. python提取发票信息发票识别_(附完整python源码)基于tensorflow、opencv的入门案例_发票识别二:字符分割...

    (附完整python源码)基于tensorflow.opencv的入门案例_发票识别二:字符分割 发布时间:2018-05-14 20:16, 浏览次数:1201 , 标签: python tenso ...

  8. 影院在线售票云平台(仿猫眼电影,附SpringBoot项目源码) 系统功能实现

    影院在线售票云平台是模仿猫眼电影开发的在线售票系统,系统分为前端网站及后台管理2部分,主要功能有影院管理,电影管理,影厅管理,排片管理,选座售票,演员管理,评论管理,影片排名,票房收入,票房排名,财务 ...

  9. 埋点数据mysql分析_用户行为分析-埋点实时数仓实践(附用户关联源码)

    一.概述 埋点采集.用户行为分析.实时数仓.IdMapping 此文重点讲述埋点的数据模型.数据格式.数据实时采集.加工.存储及用户关联.关于用户行为分析的概念.意义以及埋点相关的东西此文不作赘述 二 ...

最新文章

  1. MySQL基础篇:数据定义语言DDL
  2. git中的fork应该这样使用
  3. jdk自带压测工具_FULL GC分析过程分享
  4. ecside使用笔记(1)
  5. Django框架Day3------之Models
  6. 15.4.2:可变参数与泛型化方法
  7. Orange——The Data
  8. MySQL 无符号和有符号的区别
  9. 【课题总结】OpenCV 抠图项目实战(8)图像轮廓
  10. hive-03-hive的分区
  11. DLog-M什么意思
  12. 脉冲神经网络原理及应用pdf_CNN卷积神经网络原理讲解+图片识别应用(附源码)...
  13. SFP+光纤模块使用
  14. Android 屏蔽Menu键
  15. mathorcup历年优秀论文阿里云盘
  16. core java购买_Core Java =
  17. img下方出现空隙的原因及解决办法
  18. 「Python入门」Python多进程
  19. 数据库防火墙闪亮登场(好文共赏)
  20. 数据库习题(教材:刘爽英清华大学出版社版)

热门文章

  1. MyBatis查询传递混合参数
  2. 第二十三章《斗地主游戏》第2节:系统功能实现
  3. matlab-sub2ind()和ind2sub()
  4. sklearn库三种标准化与反标准化方法介绍
  5. 高速移动环境下MPTCP的性能测试方法
  6. 简述php语言的特点是_php语言有哪些特点
  7. vue项目连接后台数据库配置
  8. 软件工程实践2018第五次作业——团队选题报告
  9. linux存储安装教程,在Linux下安装Pngquant的三种方法:从存储库,源代码及使用Cargo安装...
  10. 利用PLINK进行GWAS分析