Epoll實現伺服器高併發

2021-06-26 04:12:53 字數 1640 閱讀 3555

最近在做乙個關於高併發伺服器相關的專案需要用到非同步/非阻塞io通訊,實現高tcp併發。

以下用epoll技術實現乙個簡單的tcp高併發伺服器,驗證無業務處理的情況下,epoll處理併發連線的數的效果。

#include#include#include#include#include#include#include#include#include#include#include#include #define maxbuf 1024

#define max_events 40000

/* setnoblocking ---設定控制代碼為非阻塞方式

* */

int setnoblocking(int sockfd)

return 0;

}int main(int argc,char **argv)

/*設定socket屬性,埠可以重用*/

int opt=so_reuseaddr;

setsockopt(listenfd,sol_socket,so_reuseaddr,&opt,sizeof(opt));

/* 設定每個程序允許開啟的最大檔案數 */

rt.rlim_max = rt.rlim_cur = max_events;

if (setrlimit(rlimit_nofile, &rt) == -1)

//將套接字設定為非阻塞模式

setnoblocking(listenfd);

if((bind(listenfd,(struct sockaddr *)&serv_addr,sin_size))<0)

//監聽長度已經是核心允許最大值,512。

listen(listenfd,512);

//建立乙個epoll控制代碼,把監聽socket加入到epoll集合裡

int epoll_fd;

if((epoll_fd=epoll_create(max_events))==-1)

ev.events=epollin | epollet;

ev.data.fd=listenfd;

// 注意,這裡的引數epollin | epollet並沒有設定對寫socket的監聽,

// 如果有寫操作的話,這個時候epoll是不會返回事件的,如果要對寫操作

// 也監聽的話,應該是epollin | epollout | epollet

//向epoll註冊listenfd監聽事件

if(epoll_ctl(epoll_fd,epoll_ctl_add,listenfd,&ev)==-1)

curfds=1;

int nfds; //epoll監聽事件發生的個數

int nread=0;

char recvbuf[1024];

int len;

//迴圈接受客戶端請求

while(1)

/*處理所有事件*/

int n;

for(n=0;n0)while(len>0);

}else if(len==0)}}

}close(listenfd);

return 0;

}

實現了乙個比nginx速度更快的http伺服器

常見多執行緒與併發伺服器設計方案舉例

高併發伺服器(基於epoll)

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

TCP伺服器實現epoll併發實現

原始碼在最下方 併發伺服器 tcp伺服器百萬級連線 申請乙個int sockfd socket af inet,sock stream,0 初始化乙個例項sockaddr in struct sockaddr in addr memset addr,0,sizeof struct sockaddr ...

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

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