#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 64
int 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;
}
Linux epoll 实例 浏览器打开返回hello world
最新推荐文章于 2020-05-18 11:24:04 发布