#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;
}