#include#define MAXLEN 1024
#define SERV_PORT 8000
#define MAX_OPEN_FD 1024
int main(int argc,char *argv[])
{
int connfd = 0;
char buffer[MAXLEN]={0};
struct sockaddr_in cliaddr;
socklen_t clilen = sizeof(cliaddr);
int listenfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in servaddr;
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
listen(listenfd,20);
int epollfd = epoll_create(MAX_OPEN_FD);
struct epoll_event stevent, events[MAX_OPEN_FD];
stevent.events = EPOLLIN;
stevent.data.fd = listenfd;
int ret = epoll_ctl(epollfd,EPOLL_CTL_ADD,listenfd,&stevent);
for (;;)
{
size_t nready = epoll_wait(epollfd,events,MAX_OPEN_FD,-1);
if (-1 == nready)
{
perror("epoll_pwait error ");
exit(EXIT_FAILURE);
}
for (int i = 0; i < nready; ++i)
{
if (events[i].data.fd == listenfd )
{
connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);
if (-1 == connfd)
{
perror("accept error");
exit(EXIT_FAILURE);
}
stevent.data.fd = connfd;
stevent.events = EPOLLIN | EPOLLET;
epoll_ctl(epollfd,EPOLL_CTL_ADD,connfd,&stevent);
}
else if(events[i].events & EPOLLIN)
{
int cli_fd = events[i].data.fd;
int nread = read(cli_fd, buffer, sizeof(buffer));
if (nread ==0)
{
epoll_ctl(epollfd,EPOLL_CTL_DEL,cli_fd,NULL);
close(cli_fd);
}
else if (nread <0)
{
perror("accept error");
return -1;
}
stevent.data.fd = cli_fd;
stevent.events = EPOLLOUT | EPOLLET;
epoll_ctl(epollfd, EPOLL_CTL_MOD, cli_fd, &stevent);
}
else if(events[i].events & EPOLLOUT)
{
int cli_fd = events[i].data.fd;
write(cli_fd, buffer, sizeof(buffer));
stevent.data.fd = cli_fd;
stevent.events = EPOLLIN | EPOLLET;
epoll_ctl(epollfd, EPOLL_CTL_MOD, cli_fd, &stevent);
}
else
{
}
}
}
return 0;
}