#include<sys/types.h>
#include<ctype.h>
#include<strings.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<errno.h>
#include<sys/time.h>
#include<stdio.h>
#include<string.h>
#include<sys/select.h>
#include<stdlib.h>
#include<signal.h>
#include<sys/wait.h>
#define RET_OK 0
#define RET_ERR -1
#define LISTEN_QUEUE_NUM 5
#define BUFFER_SIZE 256
#define ECHO_PORT 2029
int main(int argc,char **argv)
{
struct sockaddr_in servaddr,remote;
int request_sock,new_sock;
int nfound,fd,maxfd,bytesread;
uint32_t addrlen;
fd_set rset,set;
struct timeval timeout;
char buf[BUFFER_SIZE];
if((request_sock=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP))<0)
{
perror("ERROR opening socket");
return RET_ERR;
}
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=INADDR_ANY;
servaddr.sin_port=htons((uint16_t)ECHO_PORT);
if(bind(request_sock,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
{
perror("ERROR on binding");
return RET_ERR;
}
if(listen(request_sock,LISTEN_QUEUE_NUM)<0)
{
perror("ERROR on listen");
return RET_ERR;
}
FD_ZERO(&set);
FD_SET(request_sock,&set);
maxfd=request_sock;
while(1)
{
rset=set;
timeout.tv_sec=10;
timeout.tv_usec=500000;
if((nfound=select(maxfd+1,&rset,(fd_set*)0,(fd_set*)0,&timeout))<0)
{
perror("select");
return -1;
}else if(nfound==0)
{
printf(".");
fflush(stdout);
continue;
}
if(FD_ISSET(request_sock,&rset))
{
addrlen=sizeof(remote);
if((new_sock=accept(request_sock,(struct sockaddr*)&remote,&addrlen))<0)
{
perror("accept");
return -1;
}
printf("connection from host %s,port %d,socket %d\r\n",inet_ntoa(remote.sin_addr),ntohs(remote.sin_port),new_sock);
FD_SET(new_sock,&set);
if(new_sock > maxfd)maxfd=new_sock;
FD_CLR(request_sock,&rset);
nfound--;
}
for(fd=0;fd<=maxfd&&nfound>0;fd++)
{
if(FD_ISSET(fd,&rset))
{
nfound--;
if((bytesread=read(fd,buf,sizeof(buf)-1))<0)
{
perror("read");
}
if(bytesread==0)
{
fprintf(stderr,"server: end of file on %d\r\n",fd);
FD_CLR(fd,&set);
close(fd);
continue;
}
buf[bytesread]=0;
printf("%s: %d bytes from %d: %s\n",argv[0],bytesread,fd,buf);
if(write(fd,buf,bytesread)<0)
{
perror("echo");
FD_CLR(fd,&set);
close(fd);
}
}
}
}
return 0;
}
用select的IO复用多客户ECHO_TCP服务器
原创springrfc侃侃 ©著作权
©著作权归作者所有:来自51CTO博客作者springrfc侃侃的原创作品,请联系作者获取转载授权,否则将追究法律责任
下一篇:我的友情链接
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Java NIO - IO多路复用详解
本文主要对IO多路复用,Ractor模型以及Java NIO对其的支持。
Java IO/NIO/AIO -
Java TCP ECHO服务器客户端[CODE]java 客户端 .net 数据 实例化
-
IO 多路复用之select(高效并发服务器)
一、I/O 多路复用概述 I/O 多路复用技术是为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻但s...
select 高并发服务器 文件描述符 描述符 #include -
select IO复用机制
1 基本原理注:select 原理图,摘自 IBM iSeries 信息中心。1 数据结构与函数原型1.1 t *writeset, fd_set* exceptset, s
io server socket struct descriptor -
Select模型的 单服务器多客户端示范代码
学习
客户端 非阻塞 #include 监听模式 加载