linux c socket之多路复用:绑定多个端口
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash
免费下载资源
·
/*
* 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等文件请在以前文章中找。
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e
added ecosystem file for PM2 4 年前
5def40a3
Add host customization support for the NodeJS version 4 年前
更多推荐
已为社区贡献27条内容
所有评论(0)