linux c socket之多路复用:绑定多个端口
来源:互联网 发布:scala array 转java 编辑:程序博客网 时间:2024/06/13 14:13
- /*
- * 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);
- }
FROM: http://blog.csdn.net/earbao/article/details/16840461
0 0
- linux c socket之多路复用:绑定多个端口
- linux c socket之多路复用:绑定多个端口
- Linux C Socket多路复用
- Linux:C/Socket多路复用select
- Linux:C/Socket多路复用select
- Linux:C/Socket多路复用select
- Linux:C/Socket多路复用select
- Linux:C/Socket多路复用select
- Linux:C/Socket多路复用select
- Linux:C/Socket多路复用select(转)(
- Linux:C/Socket多路复用select(转)
- C/Socket多路复用select
- linux socket和UDP 源端口绑定
- linux socket多路复用服务器
- linux socket编程之多路复用select的例子
- Socket绑定网络端口
- Linux网络编程——端口复用(多个套接字绑定同一个端口)
- Linux网络编程——端口复用(多个套接字绑定同一个端口)
- 为什么要使用SLF4J
- Latex常用数学符号
- 工厂三兄弟之工厂方法模式(四):重载,隐藏,总结
- GitHub Top 100 简介(Objective-C 项目 )
- Spring注入依赖对象
- linux c socket之多路复用:绑定多个端口
- 常用数据结构的时间复杂度
- 链表之判断一个链表是否为回文结构(三)
- linux c socket之局域网广播
- Javascript 严格模式详解
- linux c sockset之多播
- JavaScript作用域学习笔记
- linux网络编程之-----多播(组播)编程
- 多进程 fork之后父子进程 对文件描述符的作用