原始碼在最下方
併發伺服器
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...