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

isware

pipe、epoll總結(jié)及實(shí)例

1、pipe的關(guān)閉消息會(huì)被對(duì)端的epoll_wait捕獲,但數(shù)據(jù)長(zhǎng)度是0,可據(jù)此判斷為pipe關(guān)閉消息。
2、epoll_wait返回的events中,當(dāng)用戶在epoll_ctl時(shí)設(shè)置了data.ptr,則不返回data.fd,用戶只能使用data.ptr,因此自定義的結(jié)構(gòu)中處理用戶數(shù)據(jù)信息外,需要包含對(duì)應(yīng)連接的socket描述符fd,否則無(wú)法收發(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); // 我們?cè)谏厦鏇](méi)有傳入data.ptr,此時(shí)系統(tǒng)會(huì)返回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)不會(huì)回填data.fd,其值是隨機(jī)數(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 艾斯維亞 閱讀(3449) 評(píng)論(0)  編輯 收藏 引用


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


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲深爱激情| 亚洲四色影视在线观看| 一本色道久久综合精品竹菊| 国产在线视频欧美| 国内精品久久久久久久影视蜜臀| 国产精品女同互慰在线看| 欧美午夜宅男影院在线观看| 国产精品久久中文| 国产一区二区无遮挡| 在线不卡a资源高清| 亚洲人体1000| 亚洲神马久久| 久久久青草青青国产亚洲免观| 欧美不卡一区| 99视频精品在线| 久久国产免费看| 欧美精品一区在线观看| 国产精品久久久久久福利一牛影视| 国产亚洲欧美日韩一区二区| 亚洲精品美女91| 欧美在线看片| 91久久在线观看| 亚洲性感美女99在线| 久久久久久黄| 国产精品hd| 亚洲国产视频一区二区| 午夜精品福利在线观看| 欧美成人国产| 午夜视频精品| 欧美日韩国产一区精品一区 | 亚洲精品欧美日韩专区| 亚洲小说区图片区| 欧美激情视频在线播放| 国产欧美精品日韩| 一本久久青青| 欧美午夜无遮挡| 伊人久久成人| 欧美一区91| 日韩视频免费观看高清完整版| 香蕉久久久久久久av网站| 欧美日韩国产电影| 亚洲韩国一区二区三区| 久久精品国产免费| 亚洲伊人第一页| 欧美日韩一区三区四区| 亚洲激情一区二区| 蘑菇福利视频一区播放| 香蕉久久夜色精品| 国产伦精品一区二区三区视频孕妇 | 另类国产ts人妖高潮视频| 亚洲欧美日本精品| 国产精品美女久久| 亚洲免费视频网站| 一区二区三欧美| 欧美日本精品一区二区三区| 亚洲经典三级| 欧美激情1区| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产无一区二区| 欧美一区国产一区| 欧美一区三区二区在线观看| 国产日韩在线视频| 久久精品视频播放| 欧美中文在线字幕| 伊人久久大香线蕉综合热线| 老司机午夜精品视频| 久久久精品视频成人| 伊人成人开心激情综合网| 麻豆免费精品视频| 女生裸体视频一区二区三区| 亚洲日本国产| 一区二区三区四区精品| 国产精品一香蕉国产线看观看| 午夜精品一区二区三区在线| 亚洲欧美国内爽妇网| 国产欧亚日韩视频| 另类图片国产| 欧美激情1区| 亚洲尤物精选| 久久都是精品| 亚洲黄色高清| 中文在线一区| 激情综合网址| 亚洲精品日本| 国产日韩一区欧美| 欧美激情一区二区三区全黄 | 国产精品视频成人| 久久久亚洲午夜电影| 欧美成人精品影院| 亚洲免费网站| 久久天堂精品| 欧美日韩综合网| 欧美影院在线| 欧美大片一区二区三区| 亚洲免费在线| 可以看av的网站久久看| 在线综合欧美| 久久久精品国产一区二区三区| 日韩视频精品| 欧美影院在线| 亚洲手机在线| 玖玖视频精品| 久久久久网址| 国产精品jizz在线观看美国 | 亚洲免费av电影| 国产一区二区在线观看免费| 91久久在线播放| 狠狠久久亚洲欧美专区| 一本久久综合| 亚洲精品美女| 久久影视精品| 久久裸体视频| 国产欧美日韩在线视频| 亚洲人成在线观看网站高清| 一区国产精品| 午夜天堂精品久久久久| 亚洲午夜精品久久久久久浪潮| 久久亚洲午夜电影| 久久久久99| 国模精品一区二区三区色天香| 一区二区三区国产在线| 亚洲精品乱码久久久久久黑人 | 99精品国产99久久久久久福利| 精品不卡一区| 亚洲综合清纯丝袜自拍| 亚洲小说区图片区| 欧美人妖另类| 亚洲伦理一区| 日韩视频欧美视频| 美女国产一区| 亚洲成人直播| 亚洲精品小视频在线观看| 久久精品国产2020观看福利| 亚洲国产日韩欧美在线图片| 欧美性事在线| 亚洲精品国精品久久99热一| 亚洲精品乱码久久久久久蜜桃麻豆| 久久免费99精品久久久久久| 久久综合九色九九| 在线高清一区| 免费国产一区二区| 亚洲日本视频| 亚洲欧美bt| 国产日韩精品久久久| 久久黄色级2电影| 欧美成人伊人久久综合网| 91久久精品国产91性色tv| 欧美成人一品| 日韩一二在线观看| 国产欧美日本| 欧美中文字幕在线观看| 美女日韩欧美| 亚洲激情视频在线| 欧美剧在线观看| 在线视频欧美一区| 久久精品国产v日韩v亚洲| 尤妮丝一区二区裸体视频| 欧美69视频| 亚洲一二三四久久| 老司机aⅴ在线精品导航| 亚洲国产成人高清精品| 欧美成人精品激情在线观看| 亚洲最黄网站| 久久综合色天天久久综合图片| 亚洲国内自拍| 国产精品日日摸夜夜摸av| 久久精品日韩| 亚洲青色在线| 欧美在线观看视频一区二区三区| 狠狠色伊人亚洲综合成人| 欧美国产精品劲爆| 亚洲欧美经典视频| 亚洲国产91| 久久精品女人天堂| 亚洲精品日本| 国产午夜精品一区理论片飘花 | 亚洲欧美日韩国产一区二区| 国产免费一区二区三区香蕉精| 久久久久综合| 国产精品99久久久久久宅男 | 亚洲影院免费| 亚洲国内自拍| 久久在线精品| 亚洲欧美视频| 99xxxx成人网| 国产一区二区三区在线播放免费观看| 米奇777超碰欧美日韩亚洲| 午夜国产精品视频| 亚洲精品国精品久久99热一| 久久久另类综合| 亚洲欧美另类在线| 99re6这里只有精品| 红桃视频国产一区| 国产视频自拍一区| 国产精品美女在线观看| 欧美夫妇交换俱乐部在线观看| 欧美主播一区二区三区| 亚洲一区国产精品| aa级大片欧美三级| 亚洲精品久久久久|