所謂邊沿觸發:將呼叫 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...