青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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 艾斯維亞 閱讀(3448) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品视频一| 国产精品mm| 亚洲国产精品第一区二区三区| 欧美一级二级三级蜜桃| 欧美一区二区免费观在线| 亚洲专区国产精品| 欧美精品一区二区三区久久久竹菊| 蜜桃久久精品乱码一区二区| 欧美成人一品| 国产精品久久久久久久久久久久久| 国产精品久久久久天堂| 国产乱码精品| 亚洲激情第一页| 亚洲一区二区三区国产| 亚洲欧美一区二区三区极速播放| 久久精品视频在线观看| 亚洲国产欧美不卡在线观看| 亚洲一区精品电影| 免费观看久久久4p| 欧美午夜剧场| 一区视频在线看| 亚洲欧美精品伊人久久| 老牛嫩草一区二区三区日本| 亚洲乱码国产乱码精品精可以看| 欧美影院一区| 欧美日韩一区成人| 在线欧美影院| 亚洲在线一区二区三区| 美女成人午夜| 亚洲在线观看免费视频| 欧美电影在线观看完整版| 国产精品日韩一区二区三区| 亚洲国产精品一区制服丝袜 | 美日韩免费视频| 国产精品国产三级国产aⅴ入口| 欧美激情一区二区三区| 国产精品久在线观看| 亚洲福利视频二区| 久久成人综合视频| 亚洲精品在线观看免费| 久久国产精品一区二区| 国产精品欧美一区喷水| 日韩网站免费观看| 男女视频一区二区| 欧美在线3区| 国产精品激情偷乱一区二区∴| 亚洲国产美女| 久久亚洲欧美| 欧美一级片一区| 国产精品久久777777毛茸茸| 亚洲精品视频啊美女在线直播| 久久尤物电影视频在线观看| 性欧美videos另类喷潮| 国产精品午夜在线| 亚洲免费一在线| 99人久久精品视频最新地址| 欧美日本国产视频| 一区二区免费看| 亚洲精品视频中文字幕| 欧美人与禽猛交乱配视频| 欧美电影在线免费观看网站| 尤物九九久久国产精品的特点 | 噜噜噜躁狠狠躁狠狠精品视频 | 亚洲精品少妇| 欧美黄色aa电影| 亚洲精选久久| 亚洲国产精品成人久久综合一区| 蜜臀a∨国产成人精品| 亚洲国内欧美| 亚洲欧洲精品一区二区三区不卡| 欧美肥婆在线| 亚洲私拍自拍| 亚洲欧美一区二区视频| 国产一区二区三区不卡在线观看 | 久久成人国产精品| 香蕉久久a毛片| 黑丝一区二区| 欧美国产91| 欧美精品久久一区二区| aa成人免费视频| 亚洲一级片在线观看| 国产一区二区三区四区五区美女| 免费观看一区| 欧美激情欧美狂野欧美精品| 亚洲视频www| 欧美一级午夜免费电影| 亚洲福利免费| 亚洲一区二区三区免费视频| 黑人巨大精品欧美一区二区小视频 | 午夜精品久久久久久久久久久| 国产亚洲人成a一在线v站| 亚洲第一毛片| 国产精品爽黄69| 麻豆精品精华液| 国产精品家庭影院| 亚洲高清不卡| 亚洲第一区色| 国产伦精品一区二区三区在线观看| 另类天堂av| 欧美四级剧情无删版影片| 久久久噜噜噜久久中文字幕色伊伊| 久久综合伊人| 久久爱另类一区二区小说| 欧美黄色小视频| 久久婷婷久久一区二区三区| 欧美日韩精品一区二区天天拍小说| 久久久久久午夜| 欧美日韩综合视频| 欧美xx69| 欧美伊人久久| 欧美亚洲综合另类| 欧美日韩久久| 欧美黄色aaaa| 一区二区三区在线免费播放| 亚洲综合视频在线| 亚洲一级在线观看| 麻豆亚洲精品| 久久久久久久网| 国产精品一区二区女厕厕| 一二三四社区欧美黄| 亚洲精品四区| 欧美成人一品| 欧美国产成人精品| 在线播放豆国产99亚洲| 性做久久久久久久久| 亚洲欧美日韩在线高清直播| 欧美日韩精品一本二本三本| 91久久综合亚洲鲁鲁五月天| 亚洲激情视频在线播放| 麻豆国产va免费精品高清在线| 另类专区欧美制服同性| 国产一区二区三区无遮挡| 亚洲女女做受ⅹxx高潮| 亚洲欧美日韩综合国产aⅴ| 欧美精品激情| 亚洲乱码国产乱码精品精| 99视频精品全部免费在线| 欧美a一区二区| 亚洲国产精品一区二区www| 亚洲激情在线激情| 欧美激情久久久| 日韩视频在线观看| 亚洲一区免费观看| 国产精品午夜国产小视频| 香港成人在线视频| 农村妇女精品| 亚洲精品色婷婷福利天堂| 欧美二区视频| 亚洲最新在线视频| 欧美一区二区播放| 国内成+人亚洲| 欧美sm重口味系列视频在线观看| 亚洲国产欧美日韩精品| 亚洲网站在线观看| 国产欧美日韩另类一区| 久久久久久久久久久一区| 亚洲高清视频中文字幕| 夜夜爽夜夜爽精品视频| 国产精品制服诱惑| 久久婷婷色综合| 亚洲毛片视频| 久久精品国产久精国产一老狼| 一区二区三区在线免费观看| 欧美国产在线视频| 午夜欧美大尺度福利影院在线看| 久热精品视频在线观看| 亚洲免费精品| 国产美女精品在线| 免费视频久久| 亚洲一区二区三区视频| 久久综合给合| 亚洲色在线视频| 在线观看成人av电影| 国产精品a级| 免费永久网站黄欧美| 亚洲男人的天堂在线| 最新国产成人在线观看| 久久激情视频| 亚洲一区二区三区成人在线视频精品| 国产在线高清精品| 亚洲愉拍自拍另类高清精品| 久久综合国产精品台湾中文娱乐网| 99精品99久久久久久宅男| 国产欧美一区二区三区视频| 麻豆精品在线视频| 亚洲欧美一区二区三区极速播放| 亚洲国产精品一区二区第一页| 性欧美videos另类喷潮| 亚洲精品1区2区| 国产一区二区三区精品久久久| 欧美女人交a| 久久久久天天天天| 亚洲一区二区视频| 亚洲片国产一区一级在线观看| 久久夜色精品亚洲噜噜国产mv| 亚洲综合精品自拍| 亚洲精品少妇| 亚洲日本国产| 91久久在线播放| 在线观看成人av|