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

1 篇文章 0 订阅
1 篇文章 0 订阅

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值