本章節是用基本的linux基本函式加上epoll呼叫編寫乙個完整的伺服器和客戶端例子,可在linux上執行,客戶端和服務端的功能如下:
客戶端從標準輸入讀入一行,傳送到服務端
服務端從網路讀取一行,然後輸出到客戶端
客戶端收到服務端的響應,輸出這一行到標準輸出
**如下:
1 #include2 #include/*basic system data types
*/3 #include/*
basic socket definitions
*/4 #includein.h> /*
sockaddr_in{} and other internet defns
*/5 #include/*
inet(3) functions
*/6 #include/*
epoll function
*/7 #include/*
nonblocking
*/8 #include/*
setrlimit */9
10 #include11 #include12 #include13 #include
1415
1617
#define maxepollsize 10000
18#define maxline 10240
19int handle( int connfd );
20int setnonblocking( int sockfd )
21 26
return
0;27 }
2829
int main( int argc, char **argv )
30 49
50 bzero( &servaddr, sizeof( servaddr ) );
51 servaddr.sin_family = af_inet;
52 servaddr.sin_addr.s_addr = htonl ( inaddr_any );
53 servaddr.sin_port = htons ( servport );
5455 listenfd = socket( af_inet, sock_stream, 0 );
56if ( listenfd == -1 )
57
6162
int opt = 1;
63 setsockopt( listenfd, sol_socket, so_reuseaddr, &opt, sizeof( opt ) );
6465
if ( setnonblocking( listenfd ) < 0 )
66
6970
if ( bind( listenfd, ( struct sockaddr * ) &servaddr, sizeof( struct sockaddr ) ) == -1 )
71
7576
if ( listen( listenfd, listenq ) == -1 )
77
8182
/*建立 epoll 控制代碼,把監聽 socket 加入到 epoll 集合裡
*/83 kdpfd = epoll_create( maxepollsize );
84 ev.events = epollin | epollet;
85 ev.data.fd = listenfd;
86if ( epoll_ctl( kdpfd, epoll_ctl_add, listenfd, &ev ) < 0 )
87
91 curfds = 1;
9293 printf( "
epollserver startup,port %d, max connection is %d, backlog is %d\n
", servport, maxepollsize, listenq );
9495
for ( ;; )
96
104105
/*處理所有事件
*/106
for ( n = 0; n < nfds; ++n )
107
116117 sprintf( buf, "
accept form %s:%d\n
", inet_ntoa( cliaddr.sin_addr ), cliaddr.sin_port );
118 printf( "
%d:%s
", ++acceptcount, buf );
119120
if ( curfds >= maxepollsize )
121
126if ( setnonblocking( connfd ) < 0 )
127
130 ev.events = epollin | epollet;
131 ev.data.fd = connfd;
132if ( epoll_ctl( kdpfd, epoll_ctl_add, connfd, &ev ) < 0 )
133
137 curfds++;
138continue;
139 }
140141
//處理客戶端請求
142if ( handle( events[n].data.fd ) < 0 )
143
147 }
148 }
149 close( listenfd );
150return
0;151 }
152int handle( int connfd )
153
164165
if ( nread < 0 )
166
171172 write( connfd, buf, nread );
173return
0;174 }
epoll程式設計框架
epoll是linux核心中的一種可擴充套件io事件處理機制,最早在 linux 2.5.44核心中引入,可被用於代替posix select 和 poll 系統呼叫,並且在具有大量應用程式請求時能夠獲得較好的效能 此時被監視的檔案描述符數目非常大,與舊的 select 和 poll 系統呼叫完成操...
linux網路程式設計之 epoll
include include include include include include include include include include using namespace std define maxline 5 define open max 100 define listen...
python 網路程式設計 epoll的大坑
eopll 例項預設監聽 select.epollhup 一般只需要監聽select.epollin事件就行了 在另一方關閉連線時會傳送乙個空串,select.epollin 會捕捉這個空串事件,如果不對它處理的話這個事件會一直響應,需要手動關閉 connection.close 一般將所有連線的描...