epoll代码实例

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/epoll.h>

int setnonblocking(int s);
int do_use_fd(int s);

int main()
{
    printf("server starting.../n");

    int n;
#define MAX_EVENTS 10
    struct epoll_event ev, events[MAX_EVENTS];
    int listen_sock, conn_sock, nfds, epollfd;
    struct my_epoll_data
    {
        int fd;
        char* desc;
    } myevd;
    
    struct sockaddr_in servaddr;
    struct sockaddr local;
    socklen_t addrlen = sizeof(local);

    listen_sock = socket(AF_INET, SOCK_STREAM, 0);
    if (listen_sock == -1)
    {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_port = htons(10000);
    if (bind(listen_sock, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
    {
        perror("bind");
        exit(EXIT_FAILURE);
    }

    if (listen(listen_sock, 5) == -1)
    {
        perror("bind");
        exit(EXIT_FAILURE);
    }


    /* Set up listening socket, 'listen_sock' (socket(),
       bind(), listen()) */

    epollfd = epoll_create(10);
    if (epollfd == -1) {
        perror("epoll_create");
        exit(EXIT_FAILURE);
    }

    ev.events = EPOLLIN;
    myevd.fd = listen_sock;
    myevd.desc = "hello, epoll/n";
    ev.data.ptr = &myevd;
    if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) {
        perror("epoll_ctl: listen_sock");
        exit(EXIT_FAILURE);
    }

    for (;;) {
        nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
        if (nfds == -1) {
            perror("epoll_pwait");
            exit(EXIT_FAILURE);
        }

        for (n = 0; n < nfds; ++n) {
            struct my_epoll_data* pmevd = (struct my_epoll_data*)events[n].data.ptr;
            if (pmevd->fd == listen_sock) {
                conn_sock = accept(listen_sock,
                        (struct sockaddr *) &local, &addrlen);
                if (conn_sock == -1) {
                    perror("accept");
                    exit(EXIT_FAILURE);
                }

                printf("%s/n", pmevd->desc);
                setnonblocking(conn_sock);
                ev.events = EPOLLIN | EPOLLET;
                myevd.fd = conn_sock;
                myevd.desc = 0;
                ev.data.ptr = &myevd;
                if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
                            &ev) == -1) {
                    perror("epoll_ctl: conn_sock");
                    exit(EXIT_FAILURE);
                }
            } else {
                do_use_fd(pmevd->fd);
            }
        }

    }

    printf("server exiting.../n");

    return 0;   
}


int setnonblocking(int s)
{
    long flag = fcntl(s, F_GETFL, 0);
    return fcntl(s, F_SETFL, flag|O_NONBLOCK);
}

int do_use_fd(int s)
{
    char buf[1024] = {0};
    int len = 1024;

    len = recv(s, buf, len, 0);
    if (len > 0)
        printf("%s/n", buf);
    else
        return -1;

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值