Epoll 使用示例

2021-05-25 01:56:52 字數 1772 閱讀 7774

by [email protected]

所謂邊沿觸發:將呼叫 epoll_wait 期間的事件進行了合併,因此事件數量較多時,邊沿觸發才顯出優勢

使用udp時,如果 read 時緩衝區小於包長時,其結果是依賴於實現的,可能會導致epoll_wait出錯

其他相關的背景知識,可以在網上輕鬆獲取到,這裡僅列乙個示例的原始碼

#if 0

說明:乙個簡易的 tcp/udp - epoll 伺服器使用樣例,盡量簡化了邏輯

日期:2011-04-11

#endif

#include

#include

#include

#include

#include

#include

#include

#include

#include

/* for keepalive */

#include

#include

using namespace std;

#define dbg_tcp // 是否使用 tcp 樣例,注釋後為udp

#define maxsock 1000

#define maxline 1024

#define listenq 20

#define maxevents 30

#define timeout 500 // ms

#define local_ip "192.168.138.9"

#define local_port 5002

#define w_udp sock_dgram

#define w_tcp sock_stream

#define errstr strerror(errno) // 列印錯誤資訊

/* 將乙個fd設定為非阻塞 */

int w_unblockfd(int fd)

int opts;

opts = fcntl(fd, f_getfl);

if (opts < 0)

return -1;

if (fcntl(fd, f_setfl, opts)<0)

return -2;

/* 建立乙個套接字 */

int w_socket(int type)else if (nbytes < 0) else{

// to do

cout << "recv error:" << nbytes << errstr << endl;

continue;

// to do 正常處理流程

buffer[nbytes] = '/0';

// cout << "read data:" << buffer << endl;

// w_epollmod

#if 0

else if (w_ispollout(&events[i])) {  /*epollout 事件使用較少,大多數情況下是可寫的,除非對端tcp recv 過慢 */

const char *buffer = "echo";

send(fd, buffer, sizeof buffer, 0); // udp 得用 sendto

#endif

else {  /* 其他事件 */

// to do

cout << "connection closed abnormal!" << endl;

w_epolldel(epfd, fd);

return 0;

關於epoll的示例

下午研究了一下epoll,參考了以下的部落格綜合寫了乙個例子。這篇文章中有一些和我從man上面查到的不相符合的地方,特此指出。1 關於epoll create 這個函式的size引數已經器用。更推薦使用的是epoll create1 0 來代替普通的用法。另外epoll create1 epollc...

epoll監聽檔案 epoll的使用

epoll i o event notification facility 在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。相比於select,epoll最大的好處在於它不會隨著監聽fd數目的增長而降低效率。因為...

tcp伺服器示例 使用epoll監聽併發連線

程式功能 監聽tcp客戶端連線,並用epoll監聽這些客戶端傳送的資料,相當於乙個日誌接收器 include include include include include include include include include include include define max even...