- /*
- * File: main.c
- * Author: root
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/time.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <stdbool.h>
- #include "Utility.h"
- //多路复用,一个server绑定多个端口,处理多个服务
- int main(int argc, char** argv) {
- if(argc<3)
- { //参数验证
- DieWithUserMessage("param","<timeout(sec.)> <port/service>...");
- }
- long timeout=atol(argv[1]);
- int noPorts=argc-2;
- int server_socks[noPorts];
- int maxDescriptor=-1;
- for(int port=0;port<noPorts;port++)
- {
- //后面的参数全部是端口,建立socket
- server_socks[port]=SetupTCPServerSocket(argv[port+2]);
- //选择最大的sock描述符
- if(server_socks[port]>maxDescriptor)
- maxDescriptor=server_socks[port];
- }
- printf("noPorts number:%d\n",noPorts);
- puts("Start server:Hit return to shutdown");
- bool running=true;
- fd_set sockset;//面向select()函数的socket描述集合
- while(running)
- {
- //sockset置零
- FD_ZERO(&sockset);
- //添加键盘输入IO到描述符集,即句柄集合
- FD_SET(STDIN_FILENO,&sockset);
- for(int port=0;port<noPorts;port++)
- {
- //设置各个socket
- FD_SET(server_socks[port],&sockset);
- //超时设置
- struct timeval selTimeout;
- selTimeout.tv_sec=timeout;
- selTimeout.tv_usec=0;
- //轮询绑定的各个端口,挂起程序直到句柄准备好或者超时,直到有请求到达
- if(select(maxDescriptor+1,&sockset,NULL,NULL,&selTimeout)==0)
- {
- //没有请求到达
- printf("No echo request for %ld secs...server still alive\n",timeout);
- }else{
- //有客户端请求到达
- if(FD_ISSET(0,&sockset))//检查是否有键盘输入,有则退出
- {
- puts("shutting down server!");
- getchar();
- running=false;
- }
- //遍历是哪个端口的请求
- for(int port=0;port<noPorts;port++)
- {
- if(FD_ISSET(server_socks[port],&sockset))
- {
- //找到请求来自的端口,处理
- printf("Request on port %d:\n",port);
- HandleTCPClient(AcceptTCPConnection(server_socks[port]));
- }
- }
- }
- }
- }
- //清理所有socket
- for(int port=0;port<noPorts;port++)
- {
- close(server_socks[port]);
- }
- return (EXIT_SUCCESS);
- }
FROM: http://blog.csdn.net/earbao/article/details/16840461