• 服务器端代码
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<sys/socket.h>
  5. #include<sys/types.h>
  6. #include<unistd.h>
  7. #include<netinet/in.h>
  8. #include <errno.h>
  9. #include <sys/fcntl.h>
  10.  
  11. typedef struct _CLIENT{
  12. int fd;
  13. struct sockaddr_in addr;
  14. char recvbuf[];
  15. }CLIENT_S;
  16.  
  17. int main(int argc, char** argv){
  18.  
  19. int socketfd,new_fd;
  20. CLIENT_S sock_list[];
  21. struct sockaddr_in server_addr;
  22. struct sockaddr_in client_addr;
  23. struct timeval tv;
  24. char recvbuf[];
  25. int res;
  26. int max;
  27. int len,nbytes;
  28. int port = ;
  29. int i;
  30.  
  31. for(i = ; i < ; i ++){
  32. sock_list[i].fd = -;
  33. }
  34.  
  35. if((socketfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == ){
  36. fprintf(stderr, "socket Error:%s\n\a", strerror(errno));
  37. exit();
  38. }
  39.  
  40. //设置为非阻塞
  41. if (fcntl(socketfd, F_SETFL, O_NONBLOCK) == -) {
  42. fprintf(stderr, "fcntl Error:%s\n\a", strerror(errno));
  43. exit();
  44. }
  45.  
  46. bzero(&server_addr, sizeof(struct sockaddr_in));
  47. server_addr.sin_family = AF_INET;
  48. server_addr.sin_port = htons(port);
  49. server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  50.  
  51. if((bind(socketfd, &server_addr, sizeof(server_addr))) == -){
  52. fprintf(stderr, "bind Error:%s\n\a", strerror(errno));
  53. exit();
  54. }
  55.  
  56. if(listen(socketfd, ) == -){
  57. fprintf(stderr, "listen Error:%s\n\a", strerror(errno));
  58. exit();
  59. }
  60.  
  61. sock_list[].fd = socketfd;
  62. max = socketfd;
  63. fd_set watchset;//select所需要的文件描述符
  64. FD_ZERO(&watchset);
  65. //将监听socket放入扫描集合
  66. FD_SET(socketfd, &watchset);
  67.  
  68. while(){
  69. FD_ZERO(&watchset);
  70.  
  71. FD_SET(socketfd, &watchset);
  72. for(i = ; i < ; i ++){
  73. if (sock_list[i].fd != -) {
  74. FD_SET(sock_list[i].fd, &watchset);
  75. }
  76. }
  77.  
  78. res = select(max + , &watchset, NULL, NULL, NULL);
  79.  
  80. if(- == res){
  81. fprintf(stderr, "select Error:%s\n\a", strerror(errno));
  82. exit();
  83. }else if( == res){
  84. printf("Select() break and the return num is");
  85. continue;
  86. }else{
  87. if(FD_ISSET(socketfd, &watchset)){
  88. len = sizeof(struct sockaddr_in);
  89. if ((new_fd = accept(socketfd,
  90. (struct sockaddr *)&client_addr,
  91. &len)) == -) {
  92. fprintf(stderr, "Accept error:%s\n\a", strerror(errno));
  93. exit();
  94. }
  95.  
  96. for(i = ; i < ; i ++){
  97. if (sock_list[i].fd == -) {
  98. sock_list[i].fd = new_fd;
  99. sock_list[i].addr = client_addr;
  100. break;
  101. }
  102. }
  103.  
  104. fprintf(stderr, "new connect: %d\n", sock_list[i].fd);
  105.  
  106. //将其放入socket的监听集合
  107. FD_SET(new_fd, &watchset);
  108. if (max < new_fd) {
  109. max = new_fd;
  110. }
  111.  
  112. continue;
  113. }else{
  114. for (i = ; i < ; i++) { //data
  115. if (sock_list[i].fd == -)
  116. continue;
  117. if (!FD_ISSET(sock_list[i].fd, &watchset)) {
  118. continue;
  119. }
  120.  
  121. nbytes = recv(sock_list[i].fd, sock_list[i].recvbuf, sizeof(sock_list[i].recvbuf), );
  122. recvbuf[nbytes] = '\0';
  123.  
  124. printf("recv data is:%s\n",sock_list[i].recvbuf);
  125.  
  126. break;
  127. }
  128. }
  129. }
  130. }//while(1)
  131.  
  132. exit();
  133. }

Linux 网络编程(多路复用)的更多相关文章

  1. Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)

    Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...

  2. Linux 网络编程(IO模型)

    针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...

  3. Linux网络编程入门 (转载)

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  4. [转] - Linux网络编程 -- 网络知识介绍

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  5. 【转】Linux网络编程入门

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  6. 《转》Linux网络编程入门

    原地址:http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html (一)Linux网络编程--网络知识介绍 Linux网络编程-- ...

  7. Linux网络编程(六)

    网络编程中,使用多路IO复用的典型场合: 1.当客户处理多个描述字时(交互式输入以及网络接口),必须使用IO复用. 2.一个客户同时处理多个套接口. 3.一个tcp服务程序既要处理监听套接口,又要处理 ...

  8. Linux网络编程(五)

    /*Linux网络编程(五)——多路IO复用之select() 网络编程中,使用IO复用的典型场合: 1.当客户处理多个描述字时(交互式输入以及网络接口),必须使用IO复用. 2.一个客户同时处理多个 ...

  9. Linux网络编程(四)

    在linux网络编程[1-3]中,我们编写的网络程序仅仅是为了了解网络编程的基本步骤,实际应用当中的网络程序并不会用那样的.首先,如果服务器需要处理高并发访问,通常不会使用linux网络编程(三)中那 ...

  10. linux 网络编程

    linux网络编程中主要分为服务器和客户端两部分,而网络编程中又分为TCP和UDP两种.TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. ...

随机推荐

  1. POJ 3469 Dual Core CPU 最大流

    划分成两个集合使费用最小,可以转成最小割,既最大流. //#pragma comment(linker, "/STACK:1024000000,1024000000") #incl ...

  2. nio 弊端

    java-nio在Android上使用的种种弊端 August 12, 2013programming 我们知道,手机上的网络一般会比较慢(使用wifi除外),用户非常不希望自己在使用手机时被考验耐心 ...

  3. ZOJ3795_Grouping

    告诉你某些人的年龄大小关系,问你把所有的人分成若干个组,最少需要多少组,使得组内任意两个人的年龄不可比. 首先考虑特殊情况,如果所有年龄关系构成了一个环,那么这个环中所有人的年龄都是相等,也就是可比的 ...

  4. JS中this关键字详解

    本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 阅读此文章,还需要心平气和的阅读完,相信一定会有所收获,我也会不定期的发布,分享一些文章,共同学习 首先,必须搞清楚在JS里面,函数 ...

  5. BZOJ4350: 括号序列再战猪猪侠

    Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列 ...

  6. 使用html2canvas实现批量生成条形码

    /*前台代码*/ <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Generat ...

  7. beanstalkd----安装启动

    1. 安装This is beanstalkd, a fast, general-purpose work queue.See http://kr.github.io/beanstalkd/ for ...

  8. Spring 笔记

    依赖注入(Dependency Injection DI) 通过依赖注入,对象的依赖关系将由系统中负责协调对象的第三方组件在创建对象的时候进行设定.(p6 spring之旅) 在创建类的时候需要依赖的 ...

  9. 学习ES6--data1

    在ES6之前,ES5没有块级作用域,没有继承,只有函数作用域,这些导致ES5会变量提升,和函数提升,例(如有错误,请指正): function test() { var name = 'test' t ...

  10. android开源系列之——xUtils 开源库

    http://blog.csdn.net/lijunhuayc/article/details/40585607