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

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视频精品全国免费| 久久久蜜桃精品| 欧美一区二区视频在线观看2020| 中日韩美女免费视频网址在线观看| 亚洲精品五月天| 亚洲性夜色噜噜噜7777| 欧美在线不卡视频| 美国十次了思思久久精品导航| 欧美成人精品激情在线观看| 欧美精品aa| 欧美午夜一区| 国产精品欧美一区二区三区奶水 | 麻豆av一区二区三区久久| 久久另类ts人妖一区二区| 久久综合色播五月| 亚洲国产网站| 亚洲国产精品久久| 日韩视频一区| 欧美一区二区三区在线观看视频 | 亚洲精品色图| 亚洲欧美视频一区| 欧美国产成人精品| 国产精品每日更新| 亚洲精品欧洲精品| 久久精品视频在线播放| 亚洲人成高清| 久久精品免视看| 欧美视频中文字幕在线| 亚洲国产成人av在线| 午夜精品亚洲一区二区三区嫩草| 久久午夜视频| 亚洲欧美日韩国产一区| 免费成人高清在线视频| 国产欧美三级| 一区二区三区四区五区精品视频 | 亚洲开发第一视频在线播放| 欧美一区二区国产| 欧美日韩伦理在线免费| 极品少妇一区二区| 午夜在线电影亚洲一区| 久久蜜桃资源一区二区老牛| 国产精品yjizz| 99国产精品国产精品久久| 老司机一区二区| 香蕉国产精品偷在线观看不卡| 欧美日韩国产va另类| 亚洲国产精品激情在线观看| 久久久精品国产99久久精品芒果| 在线视频亚洲| 欧美日韩高清一区| 亚洲美女毛片| 亚洲大胆人体视频| 久久精品一区二区国产| 国自产拍偷拍福利精品免费一| 亚洲欧美日本在线| 日韩视频精品在线| 欧美另类一区| 亚洲视屏一区| 亚洲午夜av| 国产精品久久久久影院色老大| 制服丝袜亚洲播放| 亚洲精品视频在线看| 欧美日韩国产高清| 国产一二三精品| 男女激情久久| 久久精品国产欧美激情| 国产精品视频免费在线观看| 亚洲一区欧美激情| 99精品视频免费观看| 欧美午夜在线视频| 亚洲午夜精品| 亚洲性av在线| 国产真实久久| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲高清视频在线| 欧美二区在线观看| 亚洲乱码精品一二三四区日韩在线 | 国产婷婷色一区二区三区| 久久国产精品一区二区三区四区| 欧美亚洲一区二区在线观看| 国产一区二区0| 欧美国产精品va在线观看| 欧美成ee人免费视频| 亚洲一区二区免费视频| 欧美亚洲综合久久| 亚洲欧洲在线观看| 一区二区av| 激情综合在线| 亚洲精品乱码久久久久久| 国产精品视频网| 欧美激情一区二区三区全黄 | 免费av成人在线| 亚洲一区欧美一区| 久久青青草原一区二区| 亚洲欧美另类国产| 久久综合99re88久久爱| 亚洲综合大片69999| 久久久久综合一区二区三区| 一区二区三区精品久久久| 欧美专区日韩专区| 91久久香蕉国产日韩欧美9色| av成人动漫| 樱桃国产成人精品视频| 国产精品99久久久久久久久久久久| 国语自产精品视频在线看抢先版结局| 亚洲国产精品va在线看黑人动漫 | 一本不卡影院| 永久免费毛片在线播放不卡| 亚洲午夜久久久久久久久电影院 | 国产情人节一区| 最新成人av在线| 禁断一区二区三区在线| 亚洲综合成人在线| 亚洲一区二区三区成人在线视频精品| 久久久久久久久综合| 亚洲中字黄色| 久久夜色精品| 久久久精品tv| 性做久久久久久免费观看欧美 | 欧美电影在线| 久久久一本精品99久久精品66| 欧美日韩情趣电影| 亚洲高清久久网| 亚洲国产精品电影在线观看| 欧美亚洲日本一区| 午夜精品免费视频| 欧美三区在线视频| 日韩一级精品视频在线观看| 亚洲国产成人精品久久| 久久精品首页| 久久综合伊人77777蜜臀| 国产视频在线一区二区| 亚洲在线观看免费视频| 欧美一区二区私人影院日本| 欧美日韩精品系列| 一区二区动漫| 亚洲自拍偷拍福利| 国产精品毛片| 午夜精品免费| 老司机精品福利视频| 亚洲电影免费在线| 美女视频黄免费的久久| 亚洲国产成人av在线| 亚洲毛片在线| 欧美日本在线| 一区二区三区欧美亚洲| 欧美一区二区女人| 国模套图日韩精品一区二区| 久久久久网址| 亚洲精品乱码久久久久久久久| 日韩小视频在线观看专区| 欧美日本久久| 性欧美大战久久久久久久久| 久久免费黄色| 91久久香蕉国产日韩欧美9色| 欧美激情一区二区三区四区| 一本久道久久综合婷婷鲸鱼| 欧美一区二区视频免费观看| 亚洲第一福利视频| 黄色一区三区| 久久精品综合一区| 亚洲国产欧美在线人成| 亚洲一区3d动漫同人无遮挡| 国产日韩欧美一二三区| 欧美成人激情视频| 亚洲伊人网站| 欧美大片免费观看| 亚洲综合99| 亚洲国产精品久久久| 欧美天堂亚洲电影院在线观看| 性色av香蕉一区二区| 亚洲国产精品欧美一二99| 午夜一区二区三区在线观看| 亚洲黄一区二区三区| 欧美午夜不卡| 欧美91大片| 欧美一级片久久久久久久| 亚洲国产电影| 久久精品国产77777蜜臀| 日韩一二三在线视频播| 国产一区二区三区久久久久久久久 | 99精品欧美一区| 国产三区精品| 久久夜色精品国产亚洲aⅴ| 亚洲欧洲日产国产网站| 久久激情一区| 国产精品99久久久久久久久久久久 | 亚洲一区亚洲二区| 亚洲国产精品传媒在线观看 | 久久噜噜亚洲综合| 亚洲一区二区免费看| 亚洲精品视频免费观看| 在线日韩av| 国产综合第一页| 国产情人综合久久777777| 欧美视频一区二区三区…| 欧美激情一区二区三区全黄| 理论片一区二区在线| 久久精品一区二区三区四区|