linux c IO复用之epoll模型实例 实现服务器与多个客户端进行通信

linux c IO复用之epoll模型实例 实现服务器与多个客户端进行通信_第1张图片linux c IO复用之epoll模型实例 实现服务器与多个客户端进行通信_第2张图片

linux c IO复用之epoll模型实例 实现服务器与多个客户端进行通信_第3张图片

linux c IO复用之epoll模型实例 实现服务器与多个客户端进行通信_第4张图片

linux c IO复用之epoll模型实例 实现服务器与多个客户端进行通信_第5张图片

//util.h
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define backlogs 10
#define BUF_SIZE  150
int Socket(int domain,int type,int protocol)
{
	int fd=socket(domain,type,protocol);
	if(fd==-1)
		return -1;
	return fd;
}
int Bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen)
{
	int ret=bind(sockfd,addr,addrlen);
	if(ret==-1)
		return -1;
	return ret;
}
int Listen(int sockfd,int backlog)
{
	int ret=listen(sockfd,backlog);
	if(ret==-1)
		return -1;
	return ret;
}
int start_up(const char* ip,int port)
{
	int fd=Socket(AF_INET,SOCK_STREAM,0);
	struct sockaddr_in ser_addr;
	ser_addr.sin_family=AF_INET;
	ser_addr.sin_port=htons(port);
	ser_addr.sin_addr.s_addr=inet_addr(ip);
	int on=1;
	setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(int));
	socklen_t addrlen=sizeof(struct sockaddr);
	Bind(fd,(struct sockaddr*)&ser_addr,addrlen);
	Listen(fd,backlogs);
	return fd;
}
///////////////////////////////////////////////////////////////////////////////
//ser.c
#include"util.h"
#define OPEN_MAX 5000
int main(int argc,char *argv[])
{
	int i,listenfd,connfd,sockfd;
	int n,num=0;
	ssize_t nready,efd,res;
	char buf[BUF_SIZE],str[INET_ADDRSTRLEN];//16
	socklen_t clilen;
	struct sockaddr_in cliaddr,servaddr;
	struct epoll_event tep,ep[OPEN_MAX];//tep:epoll_ctl参数 ep: epoll_wait()参数
	listenfd=start_up(argv[1],atoi(argv[2]));
	efd=epoll_create(OPEN_MAX);          //创建epoll模型,efd指向红黑树根节点
	if(efd==-1)
	{
		perror("epoll_create error!\n");
		exit(1);
	}
	tep.events=EPOLLIN;   tep.data.fd=listenfd; //指定listenfd的监听事件为"读"
	
	res=epoll_ctl(efd,EPOLL_CTL_ADD,listenfd,&tep);//将listenfd及对应的结构体设置到树上, 
                                                     //efd可找到该树
	if(res==-1)
	{
		perror("epoll_ctl error!\n");
		exit(1);
	}
	while(1)
	{
    //epoll为server阻塞监听事件,ep为struct epoll_event类型数组,OPEN_MAX为数组容量,-1表示永                                                                
                                                                           //久阻塞
		nready=epoll_wait(efd,ep,OPEN_MAX,-1);
		if(nready==-1)
		{
			perror("epoll_wait error!!!\n");
			exit(1);
		}
		for(i=0;i");
		scanf("%s",sendbuf);
		send(cli_fd,sendbuf,strlen(sendbuf)+1,0);
		recv(cli_fd,recvbuf,128,0);
		printf("From Self Cli:%s\n",recvbuf);
	}
	close(cli_fd);
	return 0;
}

你可能感兴趣的:(linux c IO复用之epoll模型实例 实现服务器与多个客户端进行通信)