您的位置:首页 > 运维架构 > Linux

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

2016-01-03 23:29 525 查看
[cpp] view
plaincopy





/*

* 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等文件请在以前文章中找。

FROM: http://blog.csdn.net/earbao/article/details/16840461
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: