多路復用I O Epoll的簡單使用

2021-08-02 15:16:09 字數 1919 閱讀 7095

不負責任地放上中文版epoll維基,科學上網。

原理什麼的不多講,我也不是很熟,這裡就簡單寫一些實際應用要怎麼寫,當然也是很簡單的demo。

typedef

union epoll_data epoll_data_t;

struct epoll_event ;

int epoll_create(int size);

// 這個函式用來建立epoll

// 引數size是指這個epoll最多能同時監聽多少個檔案描述符的事件

// 函式返回值是epoll的檔案描述符,linux下面檔案描述符簡直無處不在

int efd = epoll_create(10);

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

// 這個函式用來管理事件的監聽

// 引數epfd就是用epoll_create函式獲得的檔案描述符

// 引數op是乙個用位數來表示配置的變數,表示當前操作是增加事件還是刪除事件

// 引數event儲存的是具體的事件配置

int fd = socket(fa_inet, stream, 0);

...struct epoll_event event;

event.data.fd = fd;

event.events = epollin | epollrdhup;

epoll_ctl(efd, epoll_ctl_add, fd, &event);

struct epoll_event 事件及結構體的書寫

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

// 這個函式用來獲取當前的事件處於待處理狀態的檔案描述符

// epfd是epoll描述符

// events是事件列表,用來獲取待處理的事件,

// maxevents表示最多能取多少個struct epoll_event

// timeout表示超時時間,如果一直沒有事件響應,那麼到了超時時間,函式會阻塞狀態返回回來,-1表示沒有超時時間,一直阻塞等待事件的到達

struct epoll_event events[10];

int ret = epoll_wait(efd, events, 10, -1);

for (int i = 0; i < ret; i++) ;

int res = read(events[i].data.fd, buf, sizeof buf);

if (res == 0) else

}

#include 

#include

#include

#include

#include

#include // 個人封裝的網路庫,相當簡單,未來會完善(說出來我自己都不信)

using

namespace

std;

int main() else ;

int ret = fdclient[events[i].data.fd].read(buf, 100);

if (ret == 0)

} else

if (ret == -1) else }}

}server.close(); // 關閉本地套接字

close(efd); // 關閉epoll檔案描述符

return

0;}

上面**中用到的網路套接字封裝我放在github中了 : crazy_net

Linux IO多路復用

一.select 函式 include include include int select int n,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout fd clr int fd,fd set set f...

I O多路復用

一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...

Linux C Socket多路復用

1.迴圈伺服器 udp伺服器 udp迴圈伺服器的實現非常簡單 udp伺服器每次從套接字上讀取乙個客戶端的請求,處理,然後將結果返回給客戶機.可以用下面的演算法來實現.socket bind while 1 因為udp是非面向連線的,沒有乙個客戶端可以老是佔住服務端.只要處理過程不是死迴圈,伺服器對於...