• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            isware

            pipe、epoll總結及實例

            1、pipe的關閉消息會被對端的epoll_wait捕獲,但數據長度是0,可據此判斷為pipe關閉消息。
            2、epoll_wait返回的events中,當用戶在epoll_ctl時設置了data.ptr,則不返回data.fd,用戶只能使用data.ptr,因此自定義的結構中處理用戶數據信息外,需要包含對應連接的socket描述符fd,否則無法收發數據。

            代碼:
            #include <sys/types.h>
            #include <unistd.h>
            #include <stdio.h>
            #include <stdlib.h>

            #include <sys/epoll.h>

            #include <sys/socket.h>
            #include <arpa/inet.h> // htons
            #include <string.h> // bzero
            //#include <fcntl.h>

            int main(int argc, char* argv[])
            {
                pid_t child;
                int pipefd[2];
                int e_fd = epoll_create(10);
                if (-1 == e_fd)
                {
                    perror("epoll_create");
                    exit(1);
                }    

                pipe(pipefd);
                printf("fd0: %d, fd1: %d \n",pipefd[0], pipefd[1]);

                if ((child = fork()) == -1)
                {
                    perror("fork");
                    close(e_fd);
                    exit(1);
                }

                if (child == 0)
                {
                    close(pipefd[0]);
                    sleep(1);
                    write(pipefd[1],"a", 1);    
                    sleep(2);
                    write(pipefd[1],"b",1);
                    sleep(3);
                    close(pipefd[1]);
                    // socket
                    {
                        int fd, status;
                        struct sockaddr_in remote;
                        remote.sin_family = AF_INET;
                        remote.sin_port = htons(5930);
                        remote.sin_addr.s_addr = inet_addr("192.168.1.213");

                        fd = socket(AF_INET, SOCK_STREAM, 0);

                        sleep(3);
                        status = connect(fd, (struct sockaddr*)&remote, sizeof(struct sockaddr));
                        if (status == -1)
                        {
                            perror("connect");
                            close(fd);
                            exit(1);
                        }

                        sleep(2);
                        if (send(fd, "hello", 5, 0) == -1)
                        {
                            perror("send");
                        }
                        close(fd);
                    }    
                    
                }
                else
                {
                    struct epoll_event evs[10];
                    struct epoll_event ev;
                    struct P_ATR{
                        int fd;
                    } pipe_atr;

                    int nds = 0, i;
                    close(pipefd[1]);
                    pipe_atr.fd = pipefd[0];
                    
                    ev.data.fd = pipefd[0];
                    //ev.data.ptr = &pipe_atr; // 不傳入data.ptr
                    ev.events = EPOLLIN;
                    epoll_ctl(e_fd, EPOLL_CTL_ADD, pipefd[0], &ev);

                    //sleep(5);
                    nds = epoll_wait(e_fd, evs, 10, -1);
                    
                    printf("epoll_wait ret %d\n", nds);
                    
                    for (i = 0; i < nds; i++)
                    {
                        int fd;
                        printf("evs[%d].data.fd: %d, ", i, fd = evs[i].data.fd); // 我們在上面沒有傳入data.ptr,此時系統會返回data.fd
                        // printf("event fd: %d\n", fd = ((struct P_ATR*)(evs[i].data.ptr))->fd);
                        if ( fd == pipefd[0])
                        {
                            char readbuf[80];
                            int readbytes = read(pipefd[0], readbuf, 1);
                            readbuf[readbytes] = 0;
                            printf ("pipe event catch, recvdata = %s, size = %d\n", readbuf, readbytes);
                        }
                    }
                    
                    ev.events = EPOLLIN;
                    epoll_ctl(e_fd, EPOLL_CTL_MOD, pipefd[0], &ev);
                    nds = epoll_wait(e_fd, evs, 10, -1);

                    printf("epoll_wait ret %d\n", nds);

                    for (i = 0; i < nds; i++)
                    {
                        int fd;
                        printf("evs[%d].data.fd: %d, ", i, fd = evs[i].data.fd);
                        // printf("event fd: %d\n", fd = ((struct P_ATR*)(evs[i].data.ptr))->fd);
                        if ( fd == pipefd[0])
                        {
                            char readbuf[80];
                            int readbytes = read(pipefd[0], readbuf, 1);
                            readbuf[readbytes] = 0;
                            printf ("pipe event catch, recvdata = %s, size = %d\n", readbuf, readbytes);
                        }
                    }
             
                    epoll_ctl(e_fd, EPOLL_CTL_MOD, pipefd[0], &ev);
                    nds = epoll_wait(e_fd, evs, 10, -1);

                    printf("epoll_wait ret %d\n", nds);

                    for (i = 0; i < nds; i++)
                    {
                        int fd;
                        printf("evs[%d].data.fd: %d, ", i, fd = evs[i].data.fd);
                        // printf("event fd: %d\n", fd = ((struct P_ATR*)(evs[i].data.ptr))->fd);
                        if ( fd == pipefd[0])
                        {
                            char readbuf[80];
                            int readbytes = read(pipefd[0], readbuf, 1);
                            readbuf[readbytes] = 0;
                            printf ("pipe event catch, recvdata = %s, size = %d\n", readbuf, readbytes);
                        }
                    }
                    close(pipefd[0]);

                    // socket
                    {
                        struct sockaddr_in addr;
                        struct sockaddr_in remote;
                        int newfd;

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

                        printf("new socket fd: %d\n", sockfd);
                        addr.sin_family = AF_INET;
                        addr.sin_port = htons(5930);
                        addr.sin_addr.s_addr = INADDR_ANY;

                        bzero(&addr.sin_zero, 8);

                        if (bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr)) == -1)    
                        {
                            perror("bind");
                            close(sockfd);
                            exit(1);
                        }        
                        
                        pipe_atr.fd = sockfd;
                        ev.data.fd = sockfd;
                        ev.data.ptr = &pipe_atr; // 傳入data.ptr
                        ev.events = EPOLLIN;
                        epoll_ctl(e_fd, EPOLL_CTL_ADD, sockfd, &ev);

                        if (listen(sockfd, 5) == -1)
                        {
                                perror("listen");
                            exit(1);
                        }

                        nds = epoll_wait(e_fd, evs, 10, -1);
                        printf("epoll_wait ret %d\n", nds);
                        
                        for (i = 0; i < nds; i++)
                        {
                            int fd;
                            socklen_t len;
                            int inds;
                            printf("evs[%d].data.fd: %d, ", i, evs[i].data.fd); // 系統不會回填data.fd,其值是隨機數字
                            printf("event fd: %d\n", fd = ((struct P_ATR*)(evs[i].data.ptr))->fd); // 系統返回用戶傳入的data.ptr
                            if ( fd == sockfd)
                            {
                                len = sizeof (struct sockaddr);
                                newfd = accept(sockfd, (struct sockaddr*)&remote, &len);
                                if (-1 == newfd)
                                {
                                    perror("accept");
                                    close(sockfd);
                                    exit(1);
                                }
                                
                                printf("new link create success, fd: %d\n", newfd);

                                struct P_ATR new_atr;
                                new_atr.fd = newfd;
                                ev.data.fd = newfd;
                                ev.data.ptr = &new_atr;
                                ev.events = EPOLLIN;
                                epoll_ctl(e_fd, EPOLL_CTL_ADD, newfd, &ev);

                                inds = epoll_wait(e_fd, evs, 10, -1);
                                printf("epoll_wait ret %d\n", inds);
                                
                                for (i = 0; i < inds; i++)
                                {    
                                    int fd;
                                    printf("evs[%d].data.fd: %d, ", i, evs[i].data.fd);
                                    printf("event fd: %d\n", fd = ((struct P_ATR*)(evs[i].data.ptr))->fd);
                                    if ( fd == newfd)
                                    {
                                        char readbuf[80];
                                        int readbytes = read(fd, readbuf, sizeof(readbuf));
                                        readbuf[readbytes] = 0;
                                        printf ("pipe event catch, dataptr = %p, recvdata = %s, size = %d\n", evs[i].data.ptr, readbuf, readbytes);
                                    }
                                }
                                close(newfd);
                                close(sockfd);                    
                            }
                        }            
                    }    
                }

                close(e_fd);
                return 0;

            }

            posted on 2011-06-11 17:24 艾斯維亞 閱讀(3442) 評論(0)  編輯 收藏 引用

            无码精品久久一区二区三区| 久久99精品久久久久久秒播| 色婷婷综合久久久中文字幕| 亚洲国产美女精品久久久久∴ | 久久影视国产亚洲| 一本大道久久东京热无码AV| 97久久超碰国产精品2021| 久久国产综合精品五月天| 久久精品一区二区三区AV| 久久精品成人| 久久777国产线看观看精品| 最新久久免费视频| 国产成人久久久精品二区三区| 日韩精品久久久久久久电影| 色综合久久中文综合网| 日产精品久久久久久久性色| 久久九九免费高清视频| 成人免费网站久久久| 久久综合综合久久综合| 免费精品久久天干天干| 日产久久强奸免费的看| 久久久久国产一级毛片高清版| 亚洲综合伊人久久综合| 色8激情欧美成人久久综合电| 久久国产精品偷99| 色综合久久综精品| 国产亚洲精午夜久久久久久| 99精品国产在热久久无毒不卡| 精品熟女少妇AV免费久久| 香港aa三级久久三级老师2021国产三级精品三级在 | 中文字幕无码免费久久| 久久久久99这里有精品10| 精品久久久久久99人妻| 国产精品美女久久久久久2018| 午夜精品久久久久久毛片| 国产精品久久婷婷六月丁香| 欧美成人免费观看久久| 伊人久久一区二区三区无码| 亚洲国产成人久久笫一页| 久久亚洲精品国产精品婷婷| 热99RE久久精品这里都是精品免费 |