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
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
相关文章推荐
- Linux下的实时流媒体编程
- linux 命令 —— cat
- linux 命令 —— cp
- java检测linux系统中所有端口的ip地址
- linux下命令执行时间统计工具time使用小结
- linux 命令 —— mv
- 阿里云 CentOS6.5 ssh连接慢的解决方案
- “Linux 中国”发布微信矩阵:不细分,毋宁死
- Linux字符设备驱动的简单总结
- linux中的通配符学习小结
- eSpeak: Linux 文本转语音工具
- 每天一个Linux之chmod命令
- LInux 中的i386,i486,i586,i686和AMD_64,X86,x86_64后缀的区别
- linux中的各种计算方式expr|bc|dc|let
- 终于搞定samba中文乱码的问题
- 【全栈工程师之路】环境搭建-CentOS服务器配置
- Linux日志文件总管——logrotate
- rc.local自启动学习
- 同一个镜像配置的两台不同ip的CentOS主机只有一台能ping得了网的解决方案
- Linux入门教程:CDN加速