• <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)  編輯 收藏 引用

            欧美日韩精品久久久免费观看| 久久久婷婷五月亚洲97号色| 久久99精品久久久久子伦| 久久超乳爆乳中文字幕| 91精品国产91久久久久福利| 伊人色综合久久| 欧美亚洲国产精品久久久久| 99国产精品久久久久久久成人热| 久久综合丁香激情久久| 久久毛片免费看一区二区三区| AAA级久久久精品无码区| 亚洲午夜无码久久久久小说| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 四虎国产精品成人免费久久| 7777精品伊人久久久大香线蕉| 久久国产精品久久久| 综合网日日天干夜夜久久| 精品久久久久久久久久中文字幕| 久久精品国产免费观看| 欧美午夜A∨大片久久| 热99re久久国超精品首页| 蜜臀av性久久久久蜜臀aⅴ| 2019久久久高清456| 中文字幕一区二区三区久久网站| 国内精品久久久久久久亚洲| 日产精品久久久久久久性色| 久久婷婷色综合一区二区| 亚洲精品国产自在久久| 亚洲中文字幕久久精品无码APP| 成人午夜精品无码区久久| 久久精品国产亚洲av高清漫画| 久久丫精品国产亚洲av| 夜夜亚洲天天久久| 伊人热热久久原色播放www| 亚洲欧洲久久久精品| 色综合久久久久久久久五月| 青青青青久久精品国产h| 久久人人爽人人爽人人片av麻烦| 国产成人精品综合久久久久| 久久精品国产久精国产| 久久久国产99久久国产一|