1. 程式人生 > >【網路庫】epoll介面封裝

【網路庫】epoll介面封裝

原生epoll一共只有三個庫函式介面,已經足夠簡潔,但具體使用上各種程式碼實現依舊千差萬別,這裡對epoll做了個簡單的介面封裝,以供參考,本人水平有限,不足之處歡迎指教。

程式碼如下:

event_epoll.h

#ifndef EVENT_EPOLL_H_
#define EVENT_EPOLL_H_

#include <functional>
#include <sys/epoll.h>


class Epoll
{
private:
    typedef std::function<void (int fd, void *ctx, int revents)> event_handler;

    struct fd_node
    {
        fd_node(): fd(-1), ctx(NULL), handler(NULL) {}
        int fd;
        void *ctx;
        event_handler handler;
    };

public:
    Epoll(): epoll_fd_(-1), maxfds_(-1), fd_nodes_(NULL), epoll_events_(NULL) {}

public:
    int Init(int maxfds);
    int Free();

    int Register(int fd, event_handler handler, void *ctx);
    int Unregister(int fd);
    int EventAdd(int fd, int events);
    int EventDel(int fd);
    int Poll(int timeout_ms);

private:
    int epoll_fd_;
    int maxfds_;
    fd_node **fd_nodes_;
    epoll_event *epoll_events_;
};

#endif /*EVENT_EPOLL_H_*/

event_epoll.cpp
#include <unistd.h>
#include <string.h>
#include "event_epoll.h"


int Epoll::Init(int maxfds)
{
    epoll_fd_ = epoll_create(maxfds);

    if (-1 == epoll_fd_) return -1;

    maxfds_ = maxfds;
    fd_nodes_ = new fd_node *[maxfds];
    epoll_events_ = new epoll_event[maxfds];

    return 0;
}

int Epoll::Free()
{
    close(epoll_fd_);

    delete epoll_events_;

    for (int i = 0; i < maxfds_; i++)
    {
        if (fd_nodes_[i]) delete fd_nodes_[i];
    }

    delete []fd_nodes_;

    return 0;
}

int Epoll::Register(int fd, event_handler handler, void *ctx)
{
    fd_node *fdn;

    if (fd >= maxfds_) return -1;

    fdn = new fd_node;
    fdn->handler = handler;
    fdn->fd = fd;
    fdn->ctx = ctx;

    fd_nodes_[fd] = fdn;

    return 0;
}

int Epoll::Unregister(int fd)
{
    if (fd >= maxfds_) return -1;

    delete fd_nodes_[fd];
    fd_nodes_[fd] = NULL;

    return 0;
}

int Epoll::EventAdd(int fd, int events)
{
    fd_node *fdn;
    struct epoll_event ep;

    if (fd >= maxfds_) return -1;

    fdn = fd_nodes_[fd];
    ep.events = events;
    ep.data.ptr = fdn;

    if (0 != epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, fd, &ep))
    {
        return -1;
    }

    return 0;
}

int Epoll::EventDel(int fd)
{
    struct epoll_event ep;

    if (0 != epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, fd, &ep))
    {
        return -1;
    }

    return 0;
}

int Epoll::Poll(int timeout_ms)
{
    int n;
    int events;
    fd_node *fdn;

    n = epoll_wait(epoll_fd_, epoll_events_, maxfds_, timeout_ms);

    for (int i = 0; i < n; i++)
    {
        events = epoll_events_[i].events;
        fdn = (fd_node *)epoll_events_[i].data.ptr;

        fdn->handler(fdn->fd, fdn->ctx, events);
    }

    return n;
}



相關推薦

網路epoll介面封裝

原生epoll一共只有三個庫函式介面,已經足夠簡潔,但具體使用上各種程式碼實現依舊千差萬別,這裡對epoll做了個簡單的介面封裝,以供參考,本人水平有限,不足之處歡迎指教。 程式碼如下: event_epoll.h #ifndef EVENT_EPOLL_H_ #def

私房乾貨.Net資料層方法的封裝

作者:白寧超 時間:2016年3月5日22:51:47 摘要:繼上篇《Oracle手邊常用70則指令碼知識彙總》文章的發表,引起很多朋友關注。便促使筆者收集整理此文。本文主要針是對微軟技術對資料庫(下文案例採用的)操作時,呼叫執行方法的封裝,這也是數年逐漸學習、吸收、實踐、完成的一個類庫。其中不免

Muduobase一、Timestamp類

second 一個 macro fin ftime mac cat gap base 一、Timestamp類 1、類圖如下: 2、 知識點 (1) 這個類繼承了 muduo::copyable, 以及 boost::less_than_comparable.

網路協議 ifconfig,IPaddr命令

1. ip addr → 不知道基本沒有用Linux 2. ifconfig 和 ip addr 的區別嗎? 3. CIDR 4. 共有IP和私有IP 5. MAC地址 6. 網路裝置的狀態標識 # 知識點: ## 核心: 1. IP設計時犯的錯誤? 低估了未來網路的發展,32位地址不夠用。於是

網路爬蟲:Python:url基礎:urllib

文章目錄 1 簡單介紹 2 相關區別 3 例項講解 (1)urllib (2)ulrlib2 (3)httplib (4)requests 4 專案實戰 1 簡單介紹

網路POJ3281 Dining

題目大意:有 N 頭牛,F 個食物,D 個飲料。N 頭牛中每頭牛隻喜歡幾個食物和飲料。每個食物和飲料只能給一頭牛。而且一頭牛必須同時獲得一個食物和一個飲料才能滿足。問至多有多少頭牛可以獲得滿足。 我們可以大致理一下對應關係:一頭牛對應幾個食物,一頭牛對應幾個飲料,而食物和飲料是沒有對應關係的。

網路POJ1149 PIGS

題目大意:有 m 個豬圈,每個豬圈裡初始時有若干頭豬。一開始所有豬圈都是關閉的。依次來了 n 個顧客,每個顧客分別會開啟指定的幾個豬圈,從中買若干頭豬。每個顧客分別都有他能夠買的數量的上限。每個顧客走後,他開啟的那些豬圈中的豬,都可以被任意地調換到其它開著的豬圈裡,然後所有豬圈重新關上。問總共最多能

BZOJ2561: 最小生成樹網路最小割

2561: 最小生成樹 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2685  Solved: 1253[Submit][Status][Discuss] Desc

網路協議BGP-LU調研

BGP-LU調研(RFC3017) 1.BGP-LU標準 BGP-LU用作域間(inter-AS)和域內(intra-AS)路由協議。BGP-LU可以在IGP區域和自治系統之間通告MPLS傳輸路徑。這些路由可能跨越一個或多個路由器躍點(hop)。 當BGP用於分發特定路由時,它還可以用於

網路協議專題總結以及網路協議高頻面試題彙總(8篇)

這是一份超詳細的HTTP協議攻略,內容大綱如下: 內容如下(點選即可跳轉): 一篇文章帶你詳解 HTTP 協議(上) 一篇文章帶你詳解 HTTP 協議之報文首部及欄位詳解(中) 一篇文章帶你詳解 HTTP 協議(下)   這是一份超詳細的TCP/IP協議

網路程式設計TCP網路程式設計中connect()、listen()和accept()三者之間的關係

舉個簡單的例子(以下程式碼只是示範性的,用於說明不同套接字的作用,實際的函式會需要更多的引數): /* 建立用於監聽和接受客戶端連線請求的套接字 */ server_sock = socket(); /* 繫結監聽的IP地址和埠 */ bind(server_sock); /* 開始監聽 */ li

網路程式設計網路程式設計 筆記

  https://blog.csdn.net/bandaoyu/article/details/83312754 Windows下C語言的Socket程式設計例子 https://blog.csdn.net/bandaoyu/article/details/83312102

3、網路程式設計Socket程式設計

一、Socket定義     Socket:在TCP/IP協議中,“IP地址+TCP或UDP埠號”唯 一標識網路通訊中的一個程序,所以“IP地址+埠號”就稱為socket。 在TCP協議中,建立連線的兩個程序各自有一個socket來標識,那麼這兩個socket組成的socket pair

2、網路程式設計TCP報文段/網路位元組序/主機位元組序/網-主位元組序轉換函式

一、TCP報文段格式     TCP雖然是面向位元組流的,但TCP傳送的資料單元卻是報文段。一個TCP報文段分為首部和資料兩個部分。TCP報文段首部的前20個位元組是固定的,後面有4n位元組是根據需要增加的選項。TCP首部的最小長度是20位元組,最大長度是60位元組。

1、網路程式設計Socket/TCP/UDP/HTTP/HTTPS/網路分層模型

一、簡介 1、相關概念     TCP:傳送控制協議(Transmission Control Protocol)     UDP:使用者資料報協議 (UDP:User Datagram Protocol)     HTTP:全稱是HyperText Transfer Pro

python tkinter登陸介面

密碼輸入錯誤會彈出messagebox,輸入正確後可調轉到MainPage(下一節編寫) from tkinter import * from tkinter.messagebox import * class LoginPage(Frame): def __init__(se

瀋陽網路賽F-Fantastic Graph貪心or網路

"Oh, There is a bipartite graph.""Make it Fantastic." X wants to check whether a bipartite graph is a fantastic graph. He has two fantast

網路資訊IE9正式版3.14即將正式釋出

近日,微軟IE總監Ryan Gavin本週通過官方部落格宣佈宣佈將在3月14日舉行的South by Southwest(SXSW)會議上釋出IE9的正式版。這對windows使用者來說絕對是個好訊息,雖然我也是windows使用者,但是我不是很喜歡IE,緩慢的網頁速度,對很多高階技術的不支援,並且與Fire

網路程式設計tcp伺服器與客戶端

TCP與UDP的區別: TCP傳輸控制協議(穩定)(慢一些) UDP使用者資料包協議(不穩定)(快一些) TCP有三次握手,a給b請求資料,b傳送請求確認併發送一個數據包,a收到資料包再發送確認訊息給b

pythonmatplotlib視覺化

官網《—— 本po環境 maxos 10.12.3 python2.7 模組下載,python2 pip install matplotlib 如果是python3 pip3 install matplotlib pyplot模組 impo