• <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總結(jié)及實例

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

            代碼:
            #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,此時系統(tǒng)會返回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); // 系統(tǒng)不會回填data.fd,其值是隨機數(shù)字
                            printf("event fd: %d\n", fd = ((struct P_ATR*)(evs[i].data.ptr))->fd); // 系統(tǒng)返回用戶傳入的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 艾斯維亞 閱讀(3416) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久国内免费视频| 精品无码久久久久久国产| 久久久久国产精品人妻| 久久精品国产色蜜蜜麻豆| 国产精品亚洲美女久久久| 久久婷婷五月综合97色直播| 伊人久久成人成综合网222| 久久夜色精品国产噜噜噜亚洲AV | 激情久久久久久久久久| 久久久久久亚洲精品不卡| 国产精品99久久久精品无码| 欧美精品一本久久男人的天堂| 欧美精品丝袜久久久中文字幕 | 亚洲欧洲久久久精品| 精品国产青草久久久久福利| 丰满少妇人妻久久久久久4| 久久精品一本到99热免费| 欧美综合天天夜夜久久| 2021最新久久久视精品爱| 国产精品99久久久久久猫咪 | 中文字幕乱码久久午夜| 久久免费视频网站| 久久久久久亚洲AV无码专区| 久久本道久久综合伊人| 久久综合久久综合久久| 久久精品国产亚洲AV无码麻豆| 欧美久久亚洲精品| 国产午夜福利精品久久| 人妻少妇久久中文字幕一区二区 | 久久e热在这里只有国产中文精品99| 亚洲愉拍99热成人精品热久久| 国内精品久久久久久久久| 久久精品国内一区二区三区| 日韩精品久久久久久免费| 久久精品免费一区二区| 美女久久久久久| 亚洲精品无码久久久久AV麻豆| 久久久久亚洲精品无码网址| 精品久久久久久无码人妻热 | 97久久香蕉国产线看观看| 欧美喷潮久久久XXXXx|