• <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| 久久久久高潮毛片免费全部播放 | 久久99精品国产麻豆不卡| 精品久久久久久无码人妻蜜桃| 三级三级久久三级久久| 国产精品禁18久久久夂久| 中文字幕久久亚洲一区| 国产精品久久久久久搜索| 无码精品久久一区二区三区| 99久久99这里只有免费费精品| 狠狠色综合网站久久久久久久| 久久久久国产精品嫩草影院| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 国产精品久久久久久久久鸭| 国产精品成人久久久| 国产精品免费看久久久香蕉| 久久人人爽人人爽人人片av高请| 久久久WWW免费人成精品| 久久99国产精品久久99| 久久久无码一区二区三区| 性做久久久久久久久浪潮| 国产精品欧美亚洲韩国日本久久 | 亚洲国产精品久久久久网站| 久久久久亚洲AV无码网站| 怡红院日本一道日本久久| 色8久久人人97超碰香蕉987| 日日狠狠久久偷偷色综合96蜜桃| 91久久精品电影| 日本久久久久久中文字幕| 精品免费tv久久久久久久| 久久精品中文字幕无码绿巨人| 伊人久久综合精品无码AV专区| 久久亚洲精品成人无码网站| 国内精品久久久久影院亚洲| 久久人人爽人人爽人人片av麻烦| 2020久久精品亚洲热综合一本| 欧美精品乱码99久久蜜桃| 久久天天躁夜夜躁狠狠| 久久亚洲春色中文字幕久久久| 韩国免费A级毛片久久|