【網路庫】epoll介面封裝
原生epoll一共只有三個庫函式介面,已經足夠簡潔,但具體使用上各種程式碼實現依舊千差萬別,這裡對epoll做了個簡單的介面封裝,以供參考,本人水平有限,不足之處歡迎指教。
程式碼如下:
event_epoll.h
event_epoll.cpp#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_*/
#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則指令碼知識彙總》文章的發表,引起很多朋友關注。便促使筆者收集整理此文。本文主要針是對微軟技術對資料庫(下文案例採用的)操作時,呼叫執行方法的封裝,這也是數年逐漸學習、吸收、實踐、完成的一個類庫。其中不免
【Muduo庫】【base】一、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 個顧客,每個顧客分別會開啟指定的幾個豬圈,從中買若干頭豬。每個顧客分別都有他能夠買的數量的上限。每個顧客走後,他開啟的那些豬圈中的豬,都可以被任意地調換到其它開著的豬圈裡,然後所有豬圈重新關上。問總共最多能
【BZOJ】2561: 最小生成樹【網路流】【最小割】
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
【python庫】matplotlib視覺化
官網《—— 本po環境 maxos 10.12.3 python2.7 模組下載,python2 pip install matplotlib 如果是python3 pip3 install matplotlib pyplot模組 impo