linux 多路复用

多路复用的概念: 在我们linux函数接口里面有很多函数都是带阻塞功能的,例如是:read/write/accept…
阻塞函数,这些函数都是当到达某个条件的时候才会阻塞,例如read函数,当网络没有数据的时候回读会阻塞
例如:write写函数当管道写满的时候他又会阻塞。。。。。
遇到这里阻塞的问题我们之前都是,开线程去处理他,这样会造成资源的浪费。

多路复用的接口函数:
/* According to POSIX.1-2001, POSIX.1-2008 */
#include

  /* According to earlier standards */#include #include #include 
//多路复用的设置函数int select(int nfds, // 所有监控的文件描述符中最大的那一个加1 fd_set *readfds,// 需要监视的读集合,所有要读的文件文件描述符的集合 fd_set *writefds,//   需要监视的写集合,所有要的写文件文件描述符的集合 fd_set *exceptfds,//其他要向我们通知的文件描述符   ->一般为NULLstruct timeval timeout*);//超时设置. 设置他监视的  时长
//时间结构体struct timeval {long    tv_sec;      /* seconds */long    tv_usec;     /* microseconds */};返回值:成功:返回文件描述 (返回 1)   超时:返回0 失败:返回-1void FD_CLR(int fd, fd_set *set);//将FD从fd_set 删除int  FD_ISSET(int fd, fd_set *set); //判断fd是否在fd_set集合中void FD_SET(int fd, fd_set *set);// 将FD加到fd_set集合里面中void FD_ZERO(fd_set *set); //清空fd_set集合
#include 
#include           /* See NOTES */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include int main()
{	//1.创建TCP通信对象int socketfd=socket(AF_INET,SOCK_STREAM,0);if(socketfd < 0){perror("creat sock fail\n");return -1;}//2.链接服务器 struct sockaddr_in  seraddr={0};seraddr.sin_family  = AF_INET; //指定网络协议为 IPV4seraddr.sin_port	= htons(12580); //取值范围 最大值65535 16位的整形   1024以后seraddr.sin_addr.s_addr = inet_addr("10.8.6.108"); //自动检测IP地址int ret=connect(socketfd,(struct sockaddr *)&seraddr,sizeof(seraddr));if(ret != 0){perror("connect fail\n");return -1;}else{printf("connect ok\n");}//开启集合的监视  //定义一个文件描述符集合fd_set fds;//定义一个时间结构体  struct timeval  time;//循环监视文件描述符集合 while(1){//清空文件描述符集合FD_ZERO(&fds);//把标准输入设备加入到集合中 FD_SET(0,&fds);//把网络通信文件描述符加入到集合中 FD_SET(socketfd,&fds);//设置监视的时长 time.tv_sec = 5; time.tv_usec = 0;int ret=select(socketfd+1,&fds,NULL,NULL,&time);if(ret < 0)//错误{perror("select fail:");return -1;}else if(ret == 0) //超时{printf("timeout\n");}else if(ret > 0) //有活跃的 {printf("ret=%d\n",ret);//判断是否 标准输入设备活跃 假设是则发送数据 if(FD_ISSET(0,&fds)){char buf[1024]={0};read(0,buf,1024);//发送到网络中write(socketfd,buf,strlen(buf));}//判断是否有数据录入 if(FD_ISSET(socketfd,&fds)){char buf[1024]={0};read(socketfd,buf,1024);printf("getdate=%s\n",buf);				}							}	}	
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部