#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netdb.h>#include <unistd.h>#include <fcntl.h>#include <sys/epoll.h>#include <errno.h>#define MAXEVENTS 64int main (){ int sfd, s; int efd; struct epoll_event event; struct epoll_event *events; struct sockaddr_in addr; sfd=socket(AF_INET,SOCK_STREAM,0); memset(&addr,0,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_port=htons(80); addr.sin_addr.s_addr=INADDR_ANY; bind(sfd,(struct sockaddr*)&addr,sizeof(addr)); printf ("80 start\n"); fcntl (sfd, F_SETFL, fcntl (sfd, F_GETFL, 0) | O_NONBLOCK); listen (sfd, SOMAXCONN); efd = epoll_create1 (0); event.data.fd = sfd; event.events = EPOLLIN | EPOLLET; epoll_ctl (efd, EPOLL_CTL_ADD, sfd, &event); events = calloc (MAXEVENTS, sizeof event); while (1){ int n, i; n = epoll_wait (efd, events, MAXEVENTS, -1); for (i = 0; i < n; i++){ printf("wait i%d\n",i); if ((events[i].events & EPOLLERR) ||(events[i].events & EPOLLHUP) ||(!(events[i].events & EPOLLIN))){ printf ("epoll error\n"); close (events[i].data.fd); continue; }else if (sfd == events[i].data.fd){ struct sockaddr in_addr; socklen_t in_len; int infd; char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; in_len = sizeof in_addr; infd = accept (sfd, &in_addr, &in_len); s = getnameinfo (&in_addr, in_len,hbuf, sizeof hbuf,sbuf, sizeof sbuf,NI_NUMERICHOST | NI_NUMERICSERV); if (s == 0) printf("Accepted connection on descriptor %d (host=%s, port=%s)\n", infd, hbuf, sbuf); fcntl (infd, F_SETFL, fcntl (sfd, F_GETFL, 0) | O_NONBLOCK); event.data.fd = infd; event.events = EPOLLIN | EPOLLET; epoll_ctl (efd, EPOLL_CTL_ADD, infd, &event); }else{ ssize_t count; char buf[512]; count = read (events[i].data.fd, buf, sizeof buf); s = write (1, buf, count); printf ("Closed connection on descriptor %d\n",events[i].data.fd); char *hw="Hello world!"; write(events[i].data.fd,hw,strlen(hw)); epoll_ctl (efd, EPOLL_CTL_ADD, events[i].data.fd,&events[i]); close (events[i].data.fd); } } } free (events); close (sfd); return EXIT_SUCCESS;}