select提供的輪詢會隨著fd數目的增長降低效率,並且其上限是系統定義過的。unp上select的例子需要程式設計者自己維護乙個fd使用情況的結構,很抽象繁瑣。後面的poll的例子和本文提到的epoll使用方法差不多,這是因為高階polling技術沒有標準,各個操縱系統的實現不一樣,而epoll是由linux提供的,是對poll的改進。個人感覺區別在於epoll對緩衝池的維護(事件的加入和維護)更簡單。
epoll的工作過程
epoll_create(size)建立監聽數目為size的epoll控制代碼,使用 epoll_ctl()對這個控制代碼的事件集進行初始化。這樣之後呼叫epoll_wait()等待所關心的事件是否發生,並對已發生的事件進行相應的操作。操作時需要根據情況使用epoll_ctl()對事件的行為進行修改和刪除。
epoll回顯伺服器**
#include #include#include
in.h>#include
#include
#include
#include
#include
#include
#define maxline 4096
#define listenq 20
#define serv_port 9877
int main(int argc, char*ar**)
//setnonblocking(connfd);
char *str =inet_ntoa(cliaddr.sin_addr);
printf(
"accapt a connection from %s\n
", str);
ev.data.fd=connfd;
ev.events=epollin|epollet;
epoll_ctl(epfd,epoll_ctl_add,connfd,&ev);
}else
if (events[i].events&epollin)
//如果是已經連線的使用者,並且收到資料,那麼進行讀入。
else
printf(
"readline error\n");
} else
if (n == 0
) buf[n] = '\0'
; printf(
"after epollin\n");
ev.data.fd=sockfd;
ev.events=epollout|epollet;
//讀完後準備寫
epoll_ctl(epfd,epoll_ctl_mod,sockfd,&ev);
}else
if(events[i].events&epollout) //
如果有資料傳送}}
return0;
}
epoll實現回射伺服器
使用 epoll 寫的回射伺服器 將從client中接收到的資料再返回給client include include include include include include include include include using namespace std define maxline ...
用udp實現乙個回顯伺服器
1.ip 2.埠號3.udp協議4.網路位元組序記憶體中的多位元組資料相對於記憶體位址有大端和小端之分,磁碟檔案中的多位元組資料相對於檔案中的偏 移位址也有大端小端之分,網路資料流同樣有大端小端之分 c語言庫函式 網路位元組序和主機位元組序的轉換 include uint32 t htonl uin...
Epoll實現伺服器高併發
最近在做乙個關於高併發伺服器相關的專案需要用到非同步 非阻塞io通訊,實現高tcp併發。以下用epoll技術實現乙個簡單的tcp高併發伺服器,驗證無業務處理的情況下,epoll處理併發連線的數的效果。include include include include include include in...