引入复用技术,可以减少进程数,无论连接多少客户端,提供服务的进程只有一个。

select函数可以实现IO复用,它可以将多个文件描述符集中到一起统一监视:

是否存在套接字接收数据?无需阻塞传输数据的套接字有哪些?哪些套接字发生了异常?

下面是具体用例:

//复用:时分复用;频分复用
//使用select函数完成IO复用
//1.设置文件描述符;指定监视范围;设置超时
//2.调用select函数
//3.查看调用结果
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/select.h>#define BUF_SIZE 30int main(void)
{fd_set reads, temps;int result, str_len;char buf[BUF_SIZE];struct timeval timeout;FD_ZERO(&reads);FD_SET(0, &reads);   //0表示标准输入描述符while(1){//调用select函数后,除了发生变化的描述符对应位以外剩下所有位将//初始化为0,因此应记住初始值reads。temps=reads;//timeout设置应在循环里,因为调用select后timeout会被替换为超时前剩余时间timeout.tv_sec=5;timeout.tv_usec=0;//调用select函数,监控范围是1,timeout是5sresult=select(1, &temps, 0, 0, &timeout);if(result==-1){puts("select error");break;}else if(result==0){puts("time out");}else{//验证第0位是否为1,即是否有标准输入if(FD_ISSET(0, &temps)){str_len=read(0, buf, BUF_SIZE);buf[str_len]=0;printf("message from console: %s \n", buf);}}}return 0;
}

实现IO复用的服务器端:

//使用select函数实现IO复用回声服务器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/select.h>#define BUF_SIZE 30void error_handling(char *message);int main(int argc, char *argv[])
{int serv_sock;int clnt_sock;struct sockaddr_in serv_addr;struct sockaddr_in clnt_addr;socklen_t clnt_addr_size;int str_len;char buf[BUF_SIZE];fd_set reads, cpy_reads;struct timeval timeout;int fd_max, fd_num;if(argc!=2){exit(1);}//TCP socketserv_sock=socket(PF_INET, SOCK_STREAM, 0);if(serv_sock == -1)error_handling("socket error!");memset(&serv_addr, 0, sizeof(serv_addr));serv_addr.sin_family = AF_INET;  //IPV4协议族serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);    //主机字节序(host)转换成网络字节序(net)(大端序)serv_addr.sin_port = htons(atoi(argv[1]));    //端口号if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1)error_handling("bind error");if(listen(serv_sock, 5) == -1)error_handling("listen error");FD_ZERO(&reads);FD_SET(serv_sock, &reads);fd_max=serv_sock;while(1){cpy_reads=reads;timeout.tv_sec=5;timeout.tv_usec=5000;if((fd_num=select(fd_max+1, &cpy_reads, 0, 0, &timeout))==-1)break;if(fd_num==0)continue;int i;for(i=0;i<fd_max+1;i++){if(FD_ISSET(i, &cpy_reads)){if(i==serv_sock)  //发生连接请求{clnt_addr_size=sizeof(clnt_addr);clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);//将新的客户端套接字加入监控FD_SET(clnt_sock, &reads);if(fd_max<clnt_sock)fd_max=clnt_sock;printf("connected client: %d \n", clnt_sock);}else   //读取消息{str_len=read(i, buf, BUF_SIZE);if(str_len==0) //如果接收到EOF结束符要关闭套接字{FD_CLR(i, &reads);  //将监控位置0close(i);printf("close client: %d \n", i);}else{write(i, buf, str_len);}}}}}close(serv_sock);return 0;
}void error_handling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}

TCP/IP网络编程——IO复用相关推荐

  1. TCP/IP网络编程(3)

    基于DUP的服务端与客户端 在TCP/IP网络编程(2)中,介绍了TCP/IP的四层模型,传输层分为TCP和UDP两种方式,通过TCP套接字完成数据交换已经进行了介绍,下面介绍通过UDP套接字完成数据 ...

  2. TCP/IP网络编程(1)

    1. 套接字 套接字是由操作系统提供的网络数据通信软件设备,即使对网络数据传输原理不了解,也能够使用套接字完成网络数据传输.为了与远程计算机进行数据传输,需要连接到英特网,套接字就是进行网络连接的工具 ...

  3. 网络编程+go+java,Go语言中的TCP/IP网络编程

    Go语言TCP/IP网络编程 乍一看,通过TCP/IP层连接两个进程会感觉可怕, 但是在Go语言中可能比你想象的要简单的多. TCP/IP层发送数据的应用场景 当然很多情况下,不是大多数情况下,使用更 ...

  4. tcp/ip网络编程--accept()函数返回的套接字

    tcp/ip网络编程–accept()函数返回的套接字 套接字:1)套接字是对网络中不同主机的应用进程之间进行双向通信的端点的抽象:一个套接字就是网络进程通信的一端.[1] 2)套接字是用来与另一个进 ...

  5. TCP/IP网络编程(一)

    TCP/IP网络编程读书笔记 第1章 理解网络编程和套接字 1.1 理解网络编程和套接字 1.1.1 构建打电话套接字 1.1.2 编写 Hello World 套接字程序 1.2 基于Linux的文 ...

  6. TCP/IP网络编程:P1->理解网络编程和套接字

    本系列文章为<TCP/IP网络编程----尹圣雨>学习笔记 文章目录 一.理解网络编程和套接字 1.1 构建接电话套接字 1.2 编写"Hello world!"服务器 ...

  7. 《TCP/IP 网络编程》笔记

    本文主要基于<TCP/IP 网络编程>这本书进行总结,主要针对 Linux 网络编程部分进行阐述,Windows 网络编程部分有需要建议阅读原书籍. 一.基础知识 网络编程 网络编程就是编 ...

  8. 高等学校计算机科学与技术教材:tcp/ip网络编程技术基础,TCP/IP网络编程技术基础...

    TCP/IP网络编程技术基础 语音 编辑 锁定 讨论 上传视频 <TCP/IP网络编程技术基础>是2012年北京交通大学出版社出版的图书,作者是王雷. 书    名 TCP/IP网络编程技 ...

  9. TCP/IP网络编程之基于TCP的服务端/客户端(二)

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

最新文章

  1. 2014.4新版uboot启动流程分析
  2. 2019攻防世界web新手区
  3. 智能算法的应用记录一点点-----TSP 路径规划
  4. [Spark][Flume]Flume 启动例子
  5. 如何让Ubuntu系统支持WebP图片格式
  6. 爬虫的增量式抓取和数据更新
  7. 梦幻西游服务器每周几维护,梦幻西游5月6日维护公告:唯美版地图不再更新
  8. 上新了三星堆!“金面具”网友P图大赛又双叒开始了……
  9. Java 面试如何坐等 offer?
  10. xcode Cornerstone 拷贝项目 提示框架头文件找不到的问题
  11. 设置自动清理mysql binlog日志和手动删除的方法
  12. ODAC (V9.5.15) 学习笔记(二十一)数据复制
  13. codeforces 711A A. Bus to Udayland(水题)
  14. java反编译 mac_java反编译工具Mac版-jd-gui for Mac下载 V1.6.6-PC6苹果网
  15. 马斯克发布会视_马斯克会成为我们的救星还是驱逐舰?
  16. python数学公式编辑工具_也许是目前最好的数学公式编辑神器——Mathpix Snipping Tool...
  17. 【json】json文件中文乱码
  18. OPPOR8107_官方线刷包_救砖包_解账户锁
  19. Expanding Cards
  20. 让数学变得更生动manim库的使用(4)-动画系统详解

热门文章

  1. remote: Repository not found. fatal: repository ‘xxxxxxx‘ not found
  2. 微耕门禁显示通信不上服务器,微耕中性门禁控制器通讯不上是怎么回事?主要有什么注意事项...
  3. 2021-2027全球与中国MPO连接器市场现状及未来发展趋势
  4. Gaussian Mixture Model:混合高斯模型介绍
  5. FLOPS, FLOPs and MACs
  6. python二级选择题与分析(10)
  7. 罗克韦尔自动化收购工业自动化系统模拟与仿真的领先软件开发商Emulate3D
  8. 是用bbed工具模拟对块的破坏,并使用rman bock recover进行块恢复
  9. Lazada代入驻靠谱?Lazada代入驻多少钱?
  10. Python中jieba库的安装方法