Linux epoll 实例 浏览器打开返回hello world

来源:互联网 发布:外国人怎么开淘宝店 编辑:程序博客网 时间:2024/06/01 10:50
#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;}


原创粉丝点击