epoll程式設計

2021-06-20 18:43:21 字數 3238 閱讀 6597

本章節是用基本的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 一般將所有連線的描...