基於epoll的併發伺服器程式設計

2021-10-01 04:24:44 字數 2472 閱讀 8775

這一篇文章主要是理清伺服器和客戶端的建立通訊的流程,整個通訊是在網路層(即ip協議以及其上的傳輸層和應用層)。不明白的話需要先了解網路7層模型、對應的報文格式和不同層的封裝。

下面主要圍繞圖11-14講述並深入**

serverfd = socket(af_inet, sock_stream, 0) // 這裡返回的描述符僅是部分開啟,還不能用於讀寫

用於將sockaddr與套接字描述符serverfd聯絡起來。套接字分兩種:主動套接字和監聽套接字,對應客戶端和服務端。

#include int bind(int sockfd, struct sockaddr *my_addr, int addrlen); // addrlen = sizeof(sockaddr_in)
呼叫listen函式告訴核心,描述符是被伺服器而不是客戶端使用。因為通常情況下,socket函式建立的描述符對應於主動套接字,預設連線乙個客戶端。而listen將socket函式建立的描述符轉化為乙個監聽套接字,該套接字可以接收來自客戶端的連線請求。

#include int listen(int sockfd, int backlog);
等待來自客戶端的連線請求到達監聽套接字listenfd,在addr中填寫客戶端的套接字位址,並返回乙個已連線描述符,這個描述符可以與客戶端通訊。

#include int accept(int listenfd, struct sockaddr *addr, int *addrlen);
監聽描述符和已連線描述符之間關係

可以實現併發,每次乙個連線請求到達監聽描述符,可以fork乙個新的程序,它通過已連線描述符與客戶端通訊。

首先簡單介紹一下epoll。epoll是io多路復用的一種技術,還有就是select和poll。[select最大的不足之處是返回時會重新建立檔案描述符集合,因此每次呼叫都必須重新開始初始化,fd_zero和 fd_set]。下面介紹epoll怎麼用

#include int epoll_create(int size) //建立epoll例項,並返回與該例項關聯的檔案描述符

int epoll_ctl(int epfd,

int op,

int fd,

struct epoll_event *event);

// epoll_ctl可以向指定的epoll加入或刪除檔案描述符

// op對fd的操作 epoll_ctl_add 將fd新增到epfd指向的epoll監聽集合中

// epoll_ctl_del 將fd從epfd指向的epoll監聽集合中刪除

// epoll_ctl_mod 使用event指定的更新事件修改已有的fd的監聽行為

struct epoll_event data;

};// events值 epollet 開啟邊緣觸發

// epollin 表示對應的檔案描述符可以讀,用來設定或者檢測

// epollout 表示對應的檔案描述符可以寫,用來設定或者檢測

// epollpri 表示存在帶外(out-of-band)資料可讀

// data是使用者私有使用,當接收到請求的時間後,data會通過epoll_wait返回給使用者。通常是將event.data.fd設為fd

int epoll_wait(int epfd,

struct epoll_event *events,

int maxevents,

int timeout);

// 呼叫epoll_wait()時,最多可以有maxevents個事件,超時時間是timeout。成功返回時,events指向每個事件的epoll_event結構體,返回的是事件數

// example

#define max_events 64

int nr_events, i, epfd;

nr_events = epoll_wait (epfd, events, max_events, -1);

if (nr_events < 0) {}

for (i = 0; i < nr_events; i++)

就是將socket程式設計和epoll結合起來實現併發伺服器

for( ; ; )

else}}

因為讀寫是乙個周而復始的過程,那麼伺服器讀了之後下一時刻就是將資料寫回

高併發伺服器(基於epoll)

本章節是用基本的linux unix基本函式編寫乙個完整的伺服器和客戶端例子,可在linux ubuntu 和unix freebsd 上執行,客戶端和服務端的功能如下 客戶端從標準輸入讀入一行,傳送到服務端 服務端從網路讀取一行,把小寫變為大寫,然後輸出到客戶端 客戶端收到服務端的響應,輸出這一行...

基於epoll的簡單高併發伺服器程式

epoll,select,poll都是基於linux unix的io復用技術。所謂io復用簡單來說就是讓核心來告知我們哪些檔案描述符讀或寫準備就緒。具體定義大家可以查閱各類書籍。epoll相對於select和poll來說對核心資源的利用更高效,因為select和poll是需要將帶有檔案描述符的資料結...

14 15 高併發伺服器中epoll程式設計

1.通過epoll實現高併發伺服器模型 lt level triggered 是預設的工作方式,並且同時支援block和no block socket.在這種做法中,核心告訴你乙個檔案描述符是否就緒了,然後你可以對這個就緒的fd進行io操作。如果你不作任何操作,核心還是會繼續通知你的,所以,這種模式...