linux c socket之多路复用:绑定多个端口
来源:互联网 发布:可以货到付款的软件 编辑:程序博客网 时间:2024/05/22 11:43
/* * 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);}
Utility.h等文件请在以前文章中找。