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

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ù)是指定生成描述符的最大范圍(我覺(jué)得這個(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;
    /* 開(kāi)始處理每個(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愛(ài)好者 Linux知識(shí)傳播者 SOHO族 開(kāi)發(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)步更快!感謝有開(kāi)源前輩的貢獻(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)程允許打開(kāi)的最大文件數(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");

    /* 開(kāi)啟 socket 監(jiān)聽(tīng) */
    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("開(kāi)啟服務(wù)成功!\n");

    /* 創(chuàng)建 epoll 句柄,把監(jiān)聽(tīng) 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)聽(tīng) 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
<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

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

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久久久久久宅男| 亚洲综合电影| 久久精品一区二区| 老色鬼精品视频在线观看播放| 老司机午夜精品视频| 欧美国产三级| 99在线精品视频在线观看| 亚洲视频精品| 久久aⅴ国产紧身牛仔裤| 美女视频网站黄色亚洲| 欧美精品情趣视频| 国产精品视频观看| 国产综合久久久久久| 亚洲国产视频一区| 亚洲天堂网在线观看| 香蕉视频成人在线观看| 久久男女视频| 亚洲精品社区| 亚洲欧美日韩国产| 美女日韩在线中文字幕| 欧美日韩在线播| 国产在线精品成人一区二区三区 | 欧美少妇一区| 国产欧美日本一区视频| 亚洲激情一区| 亚洲欧美日韩精品久久奇米色影视| 久久久久久久999| 亚洲国产精品va| 亚洲一区二区在| 久久综合图片| 国产精品久久久久久久浪潮网站 | 国产精品久久久久久久9999| 国产一区二区三区四区在线观看| 最新亚洲电影| 午夜视频久久久| 亚洲春色另类小说| 亚洲一品av免费观看| 久久综合五月| 国产农村妇女精品一区二区| 最新日韩av| 久久爱另类一区二区小说| 亚洲国产精品123| 性久久久久久久久久久久| 欧美精品日韩| 在线播放日韩欧美| 欧美一区二区三区免费大片| 亚洲国产精品专区久久| 欧美一区成人| 国产精品爱久久久久久久| 亚洲福利久久| 久久久久久亚洲综合影院红桃| 日韩午夜激情电影| 麻豆国产精品一区二区三区| 国产日韩欧美91| 亚洲影视中文字幕| 亚洲国产视频直播| 久久久久国产一区二区| 国产精品日本精品| 艳女tv在线观看国产一区| 蜜桃av噜噜一区二区三区| 亚洲免费在线看| 欧美丝袜一区二区三区| 亚洲精品国产欧美| 麻豆精品精华液| 午夜免费日韩视频| 国产精品毛片大码女人| 在线中文字幕一区| 亚洲激精日韩激精欧美精品| 久久亚洲综合色| 国外成人在线| 久久久噜噜噜久久狠狠50岁| 亚洲综合社区| 国产精品日本精品| 亚洲免费视频观看| 夜夜精品视频一区二区| 欧美欧美在线| av不卡免费看| 亚洲人成高清| 欧美剧在线免费观看网站| 亚洲欧洲日本国产| 亚洲二区视频| 欧美成人综合| 日韩视频在线一区二区三区| 亚洲国产婷婷香蕉久久久久久99 | 亚洲福利专区| 欧美成年人视频网站| 久久久久久久精| 在线观看欧美| 欧美成人精品h版在线观看| 久久免费视频网站| 在线免费不卡视频| 亚洲第一免费播放区| 欧美成人一二三| 亚洲精品久久在线| 亚洲九九精品| 国产精品jizz在线观看美国| 亚洲欧美不卡| 午夜精品福利电影| 精品粉嫩aⅴ一区二区三区四区| 亚洲无亚洲人成网站77777| 亚洲精品日韩在线观看| 亚洲视频欧美在线| 久久亚洲一区| 亚洲欧美日韩精品综合在线观看| 国产精品久久久亚洲一区| 亚洲欧美国产三级| 午夜精品区一区二区三| 国产在线精品二区| 欧美韩日一区二区| 欧美激情视频一区二区三区免费 | 国产精品一二三四| 久久精品夜色噜噜亚洲a∨| 久久久久久久久久久成人| 亚洲国产一区二区在线| 日韩亚洲成人av在线| 国产精品视频一区二区三区| 久久国产日本精品| 蜜臀a∨国产成人精品| 中文国产成人精品| 午夜在线一区二区| 亚洲国产日韩欧美综合久久| 日韩小视频在线观看专区| 国产乱码精品一区二区三区av| 美女黄网久久| 99视频超级精品| 久久男人资源视频| 亚洲精华国产欧美| 99国产精品久久久久久久久久| 国产日韩亚洲欧美| 欧美国产先锋| 国产精品国产三级国产| 免费不卡中文字幕视频| 欧美日韩精品久久久| 久久精品视频免费观看| 欧美国产在线视频| 久久国产精品久久精品国产| 欧美电影在线| 久久成人精品一区二区三区| 欧美www视频| 欧美一区免费| 欧美精品久久天天躁| 久久久久久久欧美精品| 欧美日韩精品免费在线观看视频| 久久久国产一区二区| 欧美日韩亚洲一区三区| 久久综合久久美利坚合众国| 欧美日韩在线亚洲一区蜜芽| 美女视频黄免费的久久| 国产精品久久久久久久久借妻| 欧美成人精精品一区二区频| 国产精品一区二区久久国产| 亚洲激情视频网站| 黑丝一区二区| 亚洲伊人久久综合| 日韩亚洲不卡在线| 久久青草欧美一区二区三区| 午夜精品成人在线| 欧美日韩理论| 欧美激情一区二区三区蜜桃视频| 国产精品一二| 亚洲免费观看| 91久久久在线| 久久久久成人精品| 欧美伊久线香蕉线新在线| 欧美日韩亚洲高清| 亚洲国产高清aⅴ视频| 激情综合久久| 欧美一级片久久久久久久| 亚洲一区二区三区免费视频| 欧美国产日韩a欧美在线观看| 久热re这里精品视频在线6| 国产麻豆午夜三级精品| 宅男在线国产精品| 亚洲午夜视频在线观看| 欧美激情精品久久久久久大尺度| 免费久久99精品国产自| 国产一区视频观看| 亚洲欧美一区二区三区极速播放 | 欧美国产一区二区在线观看| 美日韩精品免费观看视频| 国产午夜亚洲精品理论片色戒| 亚洲天堂av在线免费观看| 一区二区三区精密机械公司| 欧美国产日韩精品免费观看| 欧美激情成人在线| 亚洲精品1区2区| 老司机午夜精品视频| 欧美成人三级在线| 亚洲国产导航| 免费观看久久久4p| 亚洲国产日韩欧美一区二区三区| 亚洲国产91| 欧美gay视频激情| 亚洲国产中文字幕在线观看| 亚洲精品日韩精品|