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

posts - 297,  comments - 15,  trackbacks - 0
[轉(zhuǎn)]epoll用法說(shuō)明(源代碼)


epoll用到的所有函數(shù)都是在 頭文件sys/epoll.h中聲明的,下面簡(jiǎn)要說(shuō)明所用到的數(shù)據(jù)結(jié)構(gòu)和函數(shù):
所用到的數(shù)據(jù)結(jié)構(gòu)
typedef union epoll_data {
                void *ptr;
                int fd;
                __uint32_t u32;
                __uint64_t u64;
        } epoll_data_t;

        struct epoll_event {
                __uint32_t events;      /* Epoll events */
                epoll_data_t data;      /* User data variable */
        };
結(jié)構(gòu)體 epoll_event 被用于注冊(cè)所感興趣的事件和回傳所發(fā)生待處理的事件,其中epoll_data 聯(lián)合體用來(lái)保存觸發(fā)事件的某個(gè)文件描述符相關(guān)的數(shù)據(jù),例如一個(gè)client連接到服務(wù)器,服務(wù)器通過(guò)調(diào)用accept函數(shù)可以得到于這個(gè)client對(duì)應(yīng) 的socket文件描述符,可以把這文件描述符賦給epoll_data的fd字段以便后面的讀寫操作在這個(gè)文件描述符上進(jìn)行。epoll_event 結(jié)構(gòu)體的events字段是表示感興趣的事件和被觸發(fā)的事件可能的取值為:EPOLLIN :表示對(duì)應(yīng)的文件描述符可以讀;
EPOLLOUT:表示對(duì)應(yīng)的文件描述符可以寫;
EPOLLPRI:表 示對(duì)應(yīng)的文件描述符有緊急的數(shù)據(jù)可讀(我不太明白是什么意思,可能是類似client關(guān)閉  socket連接這樣的事件);
EPOLLERR:表 示對(duì)應(yīng)的文件描述符發(fā)生錯(cuò)誤;
EPOLLHUP:表示對(duì)應(yīng)的文件描述符被掛斷;
EPOLLET:表 示對(duì)應(yīng)的文件描述符有事件發(fā)生;
所用到的函數(shù):
1、epoll_create函數(shù)
     函數(shù)聲明:int epoll_create(int size)
    該函數(shù)生成一個(gè)epoll專用的文件描述符,其中的參數(shù)是指定生成描述符的最大范圍(我覺得這個(gè)參數(shù)和select函數(shù)的第一個(gè)參數(shù)應(yīng)該是類似的但是該怎 么設(shè)置才好,我也不太清楚)。
2、epoll_ctl函數(shù)
     函數(shù)聲明:int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
    
該函數(shù)用于控制某個(gè)文件描述符上的事 件,可以注冊(cè)事件,修改事件,刪除事件。
    參數(shù):epfd:由 epoll_create 生成的epoll專用的文件描述符;
                op:要進(jìn)行的操作例如注冊(cè)事件,可能的取值EPOLL_CTL_ADD 注冊(cè)、EPOLL_CTL_MOD
                        改、EPOLL_CTL_DEL 刪除
                fd:關(guān)聯(lián)的文件描述符;
                event:指向epoll_event的指針;
    如果調(diào)用成功返回0,不成功返回-1
3、epoll_wait函數(shù)
函數(shù)聲明:int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)

該函數(shù)用于輪詢I/O事件的發(fā)生;
參數(shù):
epfd:由epoll_create 生成的epoll專用的文件描述符;
epoll_event:用于回傳代處理事件的數(shù)組;
maxevents:每次能處理的事件數(shù);
timeout: 等待I/O事件發(fā)生的超時(shí)值;
返回發(fā)生事件數(shù)。
例子:


 #include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <fcntl.h>
#include <sys/epoll.h>
#include <sys/time.h>
#include <sys/resource.h>


#define MAXBUF 1024
#define MAXEPOLLSIZE 10000

/*
setnonblocking - 設(shè)置句柄為非阻塞方式
*/
int setnonblocking(int sockfd)
{
    if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0)|O_NONBLOCK) == -1) {
        return -1;
    }
    return 0;
}

/*
handle_message - 處理每個(gè) socket 上的消息收發(fā)
*/
int handle_message(int new_fd)
{
    char buf[MAXBUF + 1];
    int len;
    /* 開始處理每個(gè)新連接上的數(shù)據(jù)收發(fā) */
    bzero(buf, MAXBUF + 1);
    /* 接收客戶端的消息 */
    len = recv(new_fd, buf, MAXBUF, 0);
    if (len > 0)
        printf
            ("%d接收消息成功:'%s',共%d個(gè)字節(jié)的數(shù)據(jù)\n",
             new_fd, buf, len);
    else {
        if (len < 0)
            printf
                ("消息接收失敗!錯(cuò)誤代碼是%d,錯(cuò)誤信息是'%s'\n",
                 errno, strerror(errno));
        close(new_fd);
        return -1;
    }
    /* 處理每個(gè)新連接上的數(shù)據(jù)收發(fā)結(jié)束 */
    return len;
}
/************ 關(guān)于本文檔********************************************
*filename: epoll-server.c
*purpose: 演示epoll處理海量socket連接的方法
*wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
Linux愛好者 Linux知識(shí)傳播者 SOHO族 開發(fā)者 最擅長(zhǎng)C語(yǔ)言
*date time:2007-01-31 21:00
*Note: 任何人可以任意復(fù)制代碼并運(yùn)用這些文檔,當(dāng)然包括你的商業(yè)用途
* 但請(qǐng)遵循GPL
*Thanks to:Google
*Hope: 希望越來(lái)越多的人貢獻(xiàn)自己的力量,為科學(xué)技術(shù)發(fā)展出力
* 科技站在巨人的肩膀上進(jìn)步更快!感謝有開源前輩的貢獻(xiàn)!
*********************************************************************/
int main(int argc, char **argv)
{
    int listener, new_fd, kdpfd, nfds, n, ret, curfds;
    socklen_t len;
    struct sockaddr_in my_addr, their_addr;
    unsigned int myport, lisnum;
    struct epoll_event ev;
    struct epoll_event events[MAXEPOLLSIZE];
    struct rlimit rt;

    if (argv[1])
        myport = atoi(argv[1]);
    else
        myport = 7838;

    if (argv[2])
        lisnum = atoi(argv[2]);
    else
        lisnum = 2;

    /* 設(shè)置每個(gè)進(jìn)程允許打開的最大文件數(shù) */
    rt.rlim_max = rt.rlim_cur = MAXEPOLLSIZE;
    if (setrlimit(RLIMIT_NOFILE, &rt) == -1) {
        perror("setrlimit");
        exit(1);
    }
    else printf("設(shè)置系統(tǒng)資源參數(shù)成功!\n");

    /* 開啟 socket 監(jiān)聽 */
    if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    } else
        printf("socket 創(chuàng)建成功!\n");

    setnonblocking(listener);

    bzero(&my_addr, sizeof(my_addr));
    my_addr.sin_family = PF_INET;
    my_addr.sin_port = htons(myport);
    if (argv[3])
        my_addr.sin_addr.s_addr = inet_addr(argv[3]);
    else
        my_addr.sin_addr.s_addr = INADDR_ANY;

    if (bind
        (listener, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))
        == -1) {
        perror("bind");
        exit(1);
    } else
        printf("IP 地址和端口綁定成功\n");

    if (listen(listener, lisnum) == -1) {
        perror("listen");
        exit(1);
    } else
        printf("開啟服務(wù)成功!\n");

    /* 創(chuàng)建 epoll 句柄,把監(jiān)聽 socket 加入到 epoll 集合里 */
    kdpfd = epoll_create(MAXEPOLLSIZE);
    len = sizeof(struct sockaddr_in);
    ev.events = EPOLLIN | EPOLLET;
    ev.data.fd = listener;
    if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, listener, &ev) < 0) {
        fprintf(stderr, "epoll set insertion error: fd=%d\n", listener);
        return -1;
    } else
        printf("監(jiān)聽 socket 加入 epoll 成功!\n");
    curfds = 1;
    while (1) {
        /* 等待有事件發(fā)生 */
        nfds = epoll_wait(kdpfd, events, curfds, -1);
        if (nfds == -1) {
            perror("epoll_wait");
            break;
        }
        /* 處理所有事件 */
        for (n = 0; n < nfds; ++n) {
            if (events[n].data.fd == listener) {
                new_fd = accept(listener, (struct sockaddr *) &their_addr,
                                &len);
                if (new_fd < 0) {
                    perror("accept");
                    continue;
                } else
                    printf("有連接來(lái)自于: %d:%d, 分配的 socket 為:%d\n", inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port), new_fd);

                setnonblocking(new_fd);
                ev.events = EPOLLIN | EPOLLET;
                ev.data.fd = new_fd;
                if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, new_fd, &ev) < 0) {
                    fprintf(stderr, "把 socket '%d' 加入 epoll 失敗!%s\n",
                            new_fd, strerror(errno));
                    return -1;
                }
                curfds++;
            } else {
                ret = handle_message(events[n].data.fd);
                if (ret < 1 && errno != 11) {
                    epoll_ctl(kdpfd, EPOLL_CTL_DEL, events[n].data.fd,
                              &ev);
                    curfds--;
                }
            }
        }
    }
    close(listener);
    return 0;
}

編 譯此程序用命令:
gcc -Wall epoll-server.c -o server

運(yùn)行此程序需要具有管理員權(quán)限!

sudo ./server 7838 1

通過(guò)測(cè)試這一個(gè)服務(wù)器可能同時(shí)處理10000 -3 = 9997 個(gè)連接!

如果這是 一個(gè)在線服務(wù)系統(tǒng),那么它可以支持9997人同時(shí)在線,比如游戲、聊天等。
 原文地址 http://blog.chinaunix.net/u/8818/showart_440623.html
posted on 2010-05-06 12:03 chatler 閱讀(678) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Socket
<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产亚洲欧美另类一区二区三区| 国产日韩欧美三区| 亚洲乱码国产乱码精品精| 亚洲第一天堂av| 欧美韩日一区二区| 在线综合亚洲| 亚洲天堂久久| 国产视频亚洲| 狂野欧美一区| 欧美激情第三页| 亚洲一区三区在线观看| 亚洲欧美日本国产专区一区| 国产日韩精品电影| 久久综合激情| 欧美精品一区在线播放| 午夜精品久久久久99热蜜桃导演| 欧美一级大片在线观看| 亚洲国内精品在线| 在线一区二区视频| 狠狠干成人综合网| 亚洲日本久久| 国产亚洲免费的视频看| 亚洲大片av| 国产精品一区二区a| 欧美成人精精品一区二区频| 欧美日韩一二三区| 久久亚洲私人国产精品va| 国产精品素人视频| 一本色道久久综合亚洲精品婷婷| 亚洲视频精品| 在线免费不卡视频| 夜夜精品视频一区二区| 激情成人在线视频| 一本一本a久久| 有坂深雪在线一区| 亚洲网站在线| 日韩视频免费观看高清在线视频| 午夜精品一区二区三区在线播放| 亚洲乱亚洲高清| 午夜在线电影亚洲一区| 一本色道精品久久一区二区三区| 久久aⅴ乱码一区二区三区| 夜夜嗨av一区二区三区| 久久久精品免费视频| 亚洲欧美视频一区| 欧美日韩成人一区二区三区| 欧美www视频| 国产一区二区精品久久| 一区二区三区欧美成人| 亚洲欧洲美洲综合色网| 久久久999精品视频| 亚洲欧美国产视频| 欧美日韩午夜视频在线观看| 欧美激情麻豆| 伊大人香蕉综合8在线视| 香蕉久久夜色精品国产| 亚洲欧美国产精品va在线观看| 欧美连裤袜在线视频| 亚洲成人资源网| 亚洲国产欧美在线人成| 久久蜜桃av一区精品变态类天堂| 欧美在线视屏| 国产亚洲精品高潮| 欧美在线亚洲在线| 久久国产日韩| 国内自拍亚洲| 久久久久国内| 欧美国产精品v| 亚洲经典三级| 欧美精品国产精品| 亚洲精品久久久一区二区三区| 99视频超级精品| 欧美精品在线网站| 99综合在线| 香蕉久久夜色精品国产| 国产日韩欧美视频| 久久国产精品亚洲77777| 美女主播一区| 亚洲精品激情| 欧美视频一区二区三区| 亚洲欧美日韩国产| 久久久久久电影| 在线观看视频免费一区二区三区| 麻豆久久久9性大片| 亚洲韩国青草视频| 亚洲丝袜av一区| 国产精品一区二区你懂的| 欧美中文字幕在线播放| 亚洲大片免费看| 亚洲视频自拍偷拍| 国产性天天综合网| 欧美777四色影视在线| 夜久久久久久| 老司机午夜免费精品视频| 亚洲精品欧洲精品| 国产精品日韩欧美一区二区| 久久国产精品99精品国产| 欧美激情亚洲另类| 亚洲综合视频在线| 在线欧美视频| 欧美视频精品一区| 久久久久久亚洲精品中文字幕 | 国产伦精品一区二区三区视频孕妇| 亚洲欧美网站| 亚洲日本成人| 久久青青草原一区二区| 一区二区三区欧美| 国内精品亚洲| 欧美三级午夜理伦三级中文幕| 久久黄金**| 日韩亚洲国产欧美| 久久野战av| 亚洲欧美日韩精品一区二区| 亚洲国产91色在线| 国产日韩视频| 欧美三日本三级少妇三2023 | 久久福利一区| 亚洲精品之草原avav久久| 久久亚洲精品中文字幕冲田杏梨| 在线中文字幕不卡| 亚洲国产精品激情在线观看| 国产免费亚洲高清| 欧美日韩一区二区视频在线| 美国十次了思思久久精品导航| 亚洲免费影视| 一区二区三区四区蜜桃| 亚洲国产精品国自产拍av秋霞 | 一区二区免费在线观看| 在线观看欧美激情| 国产一区二区三区久久悠悠色av| 欧美性片在线观看| 欧美高清视频在线| 久久综合中文| 久久久国产91| 久久精品成人一区二区三区| 亚洲欧美国产毛片在线| 亚洲无限乱码一二三四麻| 亚洲人成网站999久久久综合| 欧美电影免费观看高清| 久久在线视频| 久久伊人精品天天| 老司机午夜精品| 麻豆成人在线播放| 免费观看一区| 免费日韩精品中文字幕视频在线| 久久久久久日产精品| 久久天堂成人| 免费在线亚洲| 亚洲高清久久网| 亚洲激情校园春色| 亚洲精品美女91| 夜色激情一区二区| 亚洲一区二区高清视频| 亚洲欧美日韩精品久久久久| 亚洲欧美日韩网| 久久国产精品一区二区| 久久综合狠狠综合久久综合88| 麻豆91精品| 欧美日韩国产高清视频| 国产精品国产一区二区 | 另类亚洲自拍| 欧美精品一区三区| 国产精品爱久久久久久久| 国产精品婷婷| 在线观看日韩国产| 日韩一级大片在线| 午夜精品美女自拍福到在线 | 亚洲淫性视频| 欧美一级视频| 暖暖成人免费视频| 日韩视频不卡| 欧美亚洲日本网站| 免费看亚洲片| 欧美性jizz18性欧美| 国产亚洲毛片在线| 亚洲精品少妇30p| 亚洲一区二区三区在线看| 久久精品99国产精品日本| 亚洲国产婷婷| 香蕉成人久久| 欧美高清视频www夜色资源网| 国产精品夜夜嗨| 1204国产成人精品视频| 亚洲综合三区| 欧美国产日韩亚洲一区| 亚洲欧美日韩国产成人| 欧美高清视频一区二区三区在线观看 | 日韩亚洲综合在线| 久久se精品一区精品二区| 欧美久久久久久久久| 国产亚洲精品aa午夜观看| 一区二区三区欧美在线观看| 老司机免费视频一区二区| 一本色道久久综合狠狠躁篇怎么玩 | 欧美在线短视频| 亚洲欧洲另类| 久久久久国产精品午夜一区| 国产精品久久久久久影视| 日韩网站在线观看| 麻豆精品视频在线观看视频|