kqueue example

    技术2022-05-20  44

    #include <sys/types.h>#include <netinet/in.h>#include <sys/event.h>#include <sys/time.h>#include <sys/socket.h>#include <sys/types.h>#include <arpa/inet.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#define err(msg) perror(msg)#define SA struct sockaddrstruct event{        int fd;        void (*handle)(struct event *);};static int tcp_listen(void){        struct sockaddr_in addr;        int fd;        if ((fd = socket(PF_INET, SOCK_STREAM, 0)) == -1)        {                err("socket");                return -1;        }        memset(&addr, '/0', sizeof(struct sockaddr_in));        addr.sin_family = AF_INET;        addr.sin_port = htons(8888);        if (inet_pton(AF_INET, "0.0.0.0", &addr.sin_addr) <= 0)        {                err("inet_pton");                goto err;        }        if (bind(fd, (SA *)&addr, sizeof(struct sockaddr_in)) == -1)        {                err("bind");                goto err;        }        if (listen(fd, 10) == -1)        {                err("listen");                goto err;        }        return fd;err:        close(fd);        return -1;}static void listen_readable(struct event *e){        int connfd;        connfd = accept(e->fd, NULL, NULL);        printf("connfd = %d/n", connfd);        close(connfd);}int main(void){        int fd;        int kq;        int nfds;        struct kevent ev, rev[2];        if ((fd = tcp_listen()) == -1)        {                err("tcp_listen");                return -1;        }        if ((kq = kqueue()) == -1)        {                err("kqueue");                goto err;        }        struct event e;        e.fd = fd;        e.handle = listen_readable;        EV_SET(&ev, fd, EVFILT_READ, EV_ADD, 0, 0, &e);        while (1)        {                nfds = kevent(kq, &ev, 1, rev, 2, NULL);                if (nfds <= 0)                {                        err("kevent");                        goto kevent_err;                }                for (int i = 0; i < nfds; i++)                {                        struct event *re = rev[i].udata;                        if (re)                                re->handle(re);                }        }        return 0;kevent_err:        close(kq);err:        close(fd);        return -1;}


    最新回复(0)