Linux IO多路復用之epoll網路程式設計

2021-09-30 11:47:36 字數 2509 閱讀 2449

本章節是用基本的linux基本函式加上epoll呼叫編寫乙個完整的伺服器和客戶端例子,可在linux上執行,客戶端和服務端的功能如下:

客戶端從標準輸入讀入一行,傳送到服務端

服務端從網路讀取一行,然後輸出到客戶端

客戶端收到服務端的響應,輸出這一行到標準輸出

**如下:

#include  #include  /*

basic system data types

*/#include /*

basic socket definitions

*/#include in.h> /*

sockaddr_in{} and other internet defns

*/#include /*

inet(3) functions

*/#include /*

epoll function

*/#include /*

nonblocking

*/#include /*

setrlimit

*/#include #include #include #include

#define maxepollsize 10000

#define maxline 10240

int handle(int connfd);

int setnonblocking(int sockfd)

return0;}

int main(int argc, char **ar**)

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = af_inet;

servaddr.sin_addr.s_addr = htonl (inaddr_any);

servaddr.sin_port = htons (servport);

listenfd = socket(af_inet, sock_stream, 0);

if (listenfd == -1)

int opt = 1;

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

if (setnonblocking(listenfd) < 0)

if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(struct sockaddr)) == -1)

if (listen(listenfd, listenq) == -1)

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

*/ kdpfd = epoll_create(maxepollsize);

ev.events = epollin | epollet;

ev.data.fd = listenfd;

if (epoll_ctl(kdpfd, epoll_ctl_add, listenfd, &ev) < 0)

curfds = 1;

printf("

epollserver startup,port %d, max connection is %d, backlog is %d\n

", servport, maxepollsize, listenq);

for (;;)

/*處理所有事件

*/for (n = 0; n < nfds; ++n)

sprintf(buf, "

accept form %s:%d\n

", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port);

printf("

%d:%s

", ++acceptcount, buf);

if (curfds >= maxepollsize)

if (setnonblocking(connfd) < 0)

ev.events = epollin | epollet;

ev.data.fd = connfd;

if (epoll_ctl(kdpfd, epoll_ctl_add, connfd, &ev) < 0)

curfds++;

continue;

} //

處理客戶端請求

if (handle(events[n].data.fd) < 0) }}

close(listenfd);

return0;}

int handle(int connfd)

if (nread < 0)

write(connfd, buf, nread);//

響應客戶端

return

0;}

編譯和啟動服務端

gcc epollserver.c -o epollserver

./epollserver

LinuxIO多路復用之select

listen 中backlog的值為兩個連線佇列的和 已完成連線佇列 和正處於三次握手的待連線佇列 ret listen sockfd,20 if 1 ret printf waiting for connnect n for i 0 imaxi if connfd maxfd 說明已經處理完客戶端...

LinuxIO多路復用之epoll

談到epoll,首先談一下select和poll,我們發現這兩種方式儲存監聽檔案描述符的方式為陣列 然後返回的是監聽描述符中就緒的個數 我們如果要進行處理 我們還得去監聽檔案描述符的陣列乙個乙個遍歷 去判斷哪個檔案描述符就緒 才去處理資料 而epoll內部用於儲存監聽檔案描述符的資料型別為紅黑樹 樹...

Linux IO多路復用

一.select 函式 include include include int select int n,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout fd clr int fd,fd set set f...