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

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字段以便后面的讀寫(xiě)操作在這個(gè)文件描述符上進(jìn)行。epoll_event 結(jié)構(gòu)體的events字段是表示感興趣的事件和被觸發(fā)的事件可能的取值為:EPOLLIN :表示對(duì)應(yīng)的文件描述符可以讀;
EPOLLOUT:表示對(duì)應(yīng)的文件描述符可以寫(xiě);
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 閱讀(675) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Socket
<2010年1月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用鏈接

留言簿(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>
            亚洲一区二区三区精品动漫| 久久精品视频在线观看| 欧美激情免费在线| 99热精品在线| 在线视频精品一| 在线观看欧美日韩国产| 91久久精品www人人做人人爽| 久久人人爽人人爽爽久久| 亚洲精品影院在线观看| 亚洲视频导航| 亚洲精品一区二区三区不| 日韩亚洲欧美精品| 激情久久五月| 极品少妇一区二区三区精品视频 | 欧美91视频| 国产精品久久久久久久久久妞妞| 欧美一区二区三区久久精品| 久久三级福利| 久久一区二区三区av| 国产精品qvod| 亚洲最新中文字幕| 99在线精品观看| 欧美α欧美αv大片| 久久免费少妇高潮久久精品99| 欧美日韩精品久久久| 91久久久久| 99综合在线| 久久国产欧美日韩精品| 久久久久久网站| 欧美一区免费| 久久久国产精品一区二区三区| 欧美午夜一区二区| 在线视频免费在线观看一区二区| 一本色道久久99精品综合| 免费在线看一区| 亚洲精品小视频在线观看| 亚洲美女中出| 国产精品久久久久秋霞鲁丝| 亚洲一区在线播放| 久久亚洲春色中文字幕| 亚洲国产欧美一区| 欧美激情1区| 亚洲一区国产| 亚洲电影免费观看高清| 亚洲精品免费电影| 欧美视频中文在线看| 亚洲欧美日韩国产综合精品二区| 欧美在线观看一区二区三区| 激情婷婷亚洲| 欧美mv日韩mv国产网站app| 亚洲国产mv| 国产欧美精品| 欧美午夜剧场| 蜜臀av性久久久久蜜臀aⅴ四虎 | 午夜一区二区三区不卡视频| 免费成人高清视频| 欧美亚洲免费| 亚洲欧美国产日韩中文字幕| 亚洲黄色免费电影| 国产欧美婷婷中文| 国产精品v亚洲精品v日韩精品| 久久久综合网站| 欧美制服丝袜| 久久久久国产精品www| 欧美亚洲综合在线| 香蕉av福利精品导航| 亚洲影院色无极综合| 亚洲一区二区三区四区在线观看| 亚洲国产日韩欧美在线图片| 欧美韩日视频| 欧美激情1区2区3区| 亚洲国产另类 国产精品国产免费| 久久精品视频在线看| 久久一区二区三区av| 久久综合九色| 亚洲欧洲精品一区二区三区波多野1战4 | 一区二区三区毛片| 亚洲免费黄色| 亚洲视频1区| 久久久精品久久久久| 欧美freesex8一10精品| 欧美日本簧片| 国产综合激情| 一本一本大道香蕉久在线精品| 亚洲字幕一区二区| 国产亚洲美州欧州综合国| 精品不卡一区| 亚洲天堂偷拍| 欧美激情一区二区在线| 亚洲视频每日更新| 欧美激情黄色片| 樱桃国产成人精品视频| 在线亚洲国产精品网站| 欧美成年人视频网站| 国产精品99久久久久久人| 久久综合亚州| 国产偷久久久精品专区| 亚洲小说欧美另类婷婷| 亚洲第一天堂av| 久久久久久国产精品mv| 国产婷婷97碰碰久久人人蜜臀| 99热免费精品| 日韩一级大片| 欧美日韩免费网站| 亚洲午夜久久久久久尤物| 亚洲美女在线一区| 欧美激情乱人伦| 亚洲乱码国产乱码精品精天堂 | 久久久视频精品| 亚洲人成网站在线播| 亚洲高清二区| 欧美高清免费| 欧美精品日韩| 亚洲影音一区| 亚洲欧美成人综合| 国产一区二区三区视频在线观看| 欧美在线观看视频一区二区| 午夜在线电影亚洲一区| 激情成人av在线| 亚洲第一精品影视| 国产精品成人国产乱一区| 午夜精品免费视频| 久久久久久亚洲精品杨幂换脸| 亚洲国产成人91精品| 亚洲视频axxx| 亚洲韩国日本中文字幕| 一本大道久久a久久综合婷婷| 国产精品网曝门| 国产午夜精品在线| 亚洲黄色天堂| 国产午夜精品一区二区三区视频| 欧美国产另类| 国产亚洲激情在线| 亚洲网友自拍| 一区二区高清在线观看| 日韩亚洲欧美一区二区三区| 久久精品国产清自在天天线| 亚洲欧美国产一区二区三区| 日韩视频一区二区三区在线播放| 一区二区三区日韩欧美精品| 亚洲精品一区二区在线| 欧美呦呦网站| 久久久www免费人成黑人精品 | 欧美成人免费播放| 久久综合九色综合久99| 国产欧美一区二区色老头| 一区二区三区回区在观看免费视频| 亚洲国产精品久久久久秋霞影院 | 国产精品亚洲一区| 这里只有精品在线播放| 亚洲欧美另类在线观看| 欧美四级在线观看| 一区二区动漫| 久久爱另类一区二区小说| 国产综合色产在线精品| 欧美在线观看一二区| 免费成人av在线| 亚洲精品色图| 国产精品视频不卡| 久久精品视频网| 亚洲精品偷拍| 午夜精品福利在线| 亚洲福利视频一区二区| 欧美日韩网址| 久久久久国产精品一区三寸| 亚洲精品一区二区在线| 香蕉成人久久| 中文成人激情娱乐网| 亚洲电影免费观看高清完整版在线 | 一区二区三区|亚洲午夜| 国产伦精品一区二区| 欧美激情黄色片| 久久精品国产免费| 夜夜嗨av一区二区三区网页 | 久久综合网络一区二区| 亚洲一区二区三区午夜| 亚洲精品123区| 久久国产66| 午夜欧美理论片| 日韩性生活视频| 在线观看日韩一区| 国产日本欧美一区二区三区在线| 欧美岛国激情| 欧美激情综合| 欧美激情亚洲一区| 欧美日韩第一区| 欧美精品三级在线观看| 欧美精品亚洲二区| 欧美精品成人在线| 欧美日韩国产在线| 欧美视频中文字幕| 国产日韩精品一区| 国产一级揄自揄精品视频| 国产日韩欧美一区二区| 国产一区二区高清视频| 亚洲大胆视频| 亚洲综合不卡| 免费欧美视频| 99国内精品久久久久久久软件| 9人人澡人人爽人人精品|