TCP伺服器實現epoll併發實現

2021-10-11 21:11:39 字數 2859 閱讀 3230

原始碼在最下方

併發伺服器

tcp伺服器百萬級連線

申請乙個int sockfd = socket(af_inet, sock_stream, 0);

初始化乙個例項sockaddr_in

struct sockaddr_in addr;

memset(&addr, 0, sizeof(struct sockaddr_in));

add.sin_family = af_inet;

addr.sin_port = htons(port);

addr.sin_addr.s_addr = inaddr_any;

bind();bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in))listen();

建立乙個套接字並監聽申請的連線

#include

intlisten

(int sockfd,

int backlog)

;// sockfd: 用於標識乙個已捆包未連線套接字的檔案描述符

// backlog: 等待連線佇列的最大長度

accept();

accept()是在乙個套接字接受的乙個連線。accept()是c語言中網路程式設計的重要的函式,本函式從s的等待連線佇列中抽取第乙個連線,建立乙個與s同類的新的套接字並返回控制代碼。

單純的sockfd無法解決多個客戶端連線時,如何分辨的問題

可通過應用層協議來解決

但隨著客戶端你的增多 – 如:100w

不適合用一請求一線程的方式來處理。

利用 epoll

int epoll_create(int size);

建立乙個epoll的控制代碼,size用來告訴核心這個監聽的數目一共有多大。這個引數不同於select()中的第乙個引數,給出最大監聽的fd+1的值。需要注意的是,當建立好epoll控制代碼後,它就是會占用乙個fd值,在linux下如果檢視/proc/程序id/fd/,是能夠看到這個fd的,所以在使用完epoll後,必須呼叫close()關閉,否則可能導致fd被耗盡。

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

epoll的事件註冊函式,它不同與select()是在監聽事件時告訴核心要監聽什麼型別的事件,而是在這裡先註冊要監聽的事件型別。第乙個引數是epoll_create()的返回值,第二個引數表示動作,用三個巨集來表示:

typedef union epoll_data  epoll_data_t;

struct epoll_event ;

events可以是以下幾個巨集的集合:

epoll事件有兩種模型,邊沿觸發:edge-triggered (et), 水平觸發:level-triggered (lt)

socket接收緩衝區不為空 有資料可讀 讀事件一直觸發

socket傳送緩衝區不滿 可以繼續寫入資料 寫事件一直觸發

邊沿觸發(edge-triggered)

socket的接收緩衝區狀態變化時觸發讀事件,即空的接收緩衝區剛接收到資料時觸發讀事件

socket的傳送緩衝區狀態變化時觸發寫事件,即滿的緩衝區剛空出空間時觸發讀事件

邊沿觸發僅觸發一次,水平觸發會一直觸發。

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

類似於select()呼叫。引數events用來從核心得到事件的集合,maxevents告之核心這個events有多大,這個maxevents的值不能大於建立epoll_create()時的size,引數timeout是超時時間(毫秒,0 會立即返回,-1 將不確定,也有說法說是永久阻塞)。該函式返回需要處理的事件數目,如返回0表示已超時。

$ gcc -o tcp_server tcp_server.c

$ ./tcp_server 8888

需要乙個netassist.exe的軟體可以做測

Epoll實現伺服器高併發

最近在做乙個關於高併發伺服器相關的專案需要用到非同步 非阻塞io通訊,實現高tcp併發。以下用epoll技術實現乙個簡單的tcp高併發伺服器,驗證無業務處理的情況下,epoll處理併發連線的數的效果。include include include include include include in...

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

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

TCP併發伺服器

int main int recvcnt 0 struct sockaddr in sock server struct sockaddr in sock client int len sizeof struct sockaddr socketfd socket pf inet,sock strea...