linux c socket之多路复用:绑定多个端口

来源:互联网 发布:scala array 转java 编辑:程序博客网 时间:2024/06/13 14:13

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /*  
  2.  * File:   main.c 
  3.  * Author: root 
  4.  */  
  5. #include <stdio.h>  
  6. #include <stdlib.h>  
  7. #include <sys/time.h>  
  8. #include <unistd.h>  
  9. #include <fcntl.h>  
  10. #include <stdbool.h>  
  11. #include "Utility.h"  
  12. //多路复用,一个server绑定多个端口,处理多个服务  
  13. int main(int argc, char** argv) {  
  14.     if(argc<3)  
  15.     {   //参数验证  
  16.         DieWithUserMessage("param","<timeout(sec.)> <port/service>...");  
  17.     }  
  18.     long timeout=atol(argv[1]);  
  19.     int noPorts=argc-2;  
  20.     int server_socks[noPorts];  
  21.     int maxDescriptor=-1;  
  22.     for(int port=0;port<noPorts;port++)  
  23.     {  
  24.         //后面的参数全部是端口,建立socket  
  25.         server_socks[port]=SetupTCPServerSocket(argv[port+2]);  
  26.         //选择最大的sock描述符  
  27.         if(server_socks[port]>maxDescriptor)  
  28.             maxDescriptor=server_socks[port];  
  29.     }  
  30.     printf("noPorts number:%d\n",noPorts);  
  31.     puts("Start server:Hit return to shutdown");  
  32.     bool running=true;  
  33.     fd_set sockset;//面向select()函数的socket描述集合  
  34.     while(running)  
  35.     {  
  36.         //sockset置零  
  37.         FD_ZERO(&sockset);  
  38.         //添加键盘输入IO到描述符集,即句柄集合  
  39.         FD_SET(STDIN_FILENO,&sockset);  
  40.         for(int port=0;port<noPorts;port++)  
  41.         {  
  42.             //设置各个socket  
  43.             FD_SET(server_socks[port],&sockset);  
  44.             //超时设置  
  45.             struct timeval selTimeout;  
  46.             selTimeout.tv_sec=timeout;  
  47.             selTimeout.tv_usec=0;  
  48.             //轮询绑定的各个端口,挂起程序直到句柄准备好或者超时,直到有请求到达  
  49.             if(select(maxDescriptor+1,&sockset,NULL,NULL,&selTimeout)==0)  
  50.             {  
  51.                 //没有请求到达  
  52.                 printf("No echo request for %ld secs...server still alive\n",timeout);  
  53.             }else{  
  54.                 //有客户端请求到达  
  55.                 if(FD_ISSET(0,&sockset))//检查是否有键盘输入,有则退出  
  56.                 {  
  57.                     puts("shutting down server!");  
  58.                     getchar();  
  59.                     running=false;  
  60.                 }  
  61.                 //遍历是哪个端口的请求  
  62.                 for(int port=0;port<noPorts;port++)  
  63.                 {  
  64.                     if(FD_ISSET(server_socks[port],&sockset))  
  65.                     {  
  66.                         //找到请求来自的端口,处理  
  67.                         printf("Request on port %d:\n",port);  
  68.                         HandleTCPClient(AcceptTCPConnection(server_socks[port]));  
  69.                     }  
  70.                 }  
  71.             }  
  72.               
  73.         }  
  74.     }  
  75.     //清理所有socket  
  76.     for(int port=0;port<noPorts;port++)  
  77.     {  
  78.         close(server_socks[port]);  
  79.     }  
  80.   
  81.     return (EXIT_SUCCESS);  
  82. }  
Utility.h等文件请在以前文章中找。


FROM: http://blog.csdn.net/earbao/article/details/16840461

0 0
原创粉丝点击