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等文件请在以前文章中找。
原创粉丝点击