高併發伺服器(基於epoll)

2021-07-23 17:15:20 字數 3026 閱讀 3475

本章節是用基本的linux/unix基本函式編寫乙個完整的伺服器和客戶端例子,可在linux(ubuntu)和unix(freebsd)上執行,客戶端和服務端的功能如下:

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

服務端從網路讀取一行,把小寫變為大寫,然後輸出到客戶端

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

**如下:

#include  #include  /*

basic system data types

*/#include /*

basic socket definitions

*/#include in.h> /*

sockaddr_in{} and other internet defns

*/#include /*

inet(3) functions

*/#include #include #include #include

#define maxline 1024

//typedef struct sockaddr sa;

void handle(int connfd);

int main(int argc, char **argv)

if (bind(listenfd, (struct sockaddr *) &servaddr, socklen) < 0)

if (listen(listenfd, listenq) < 0)

printf("

echo server startup,listen on port:%d\n

", serverport);

for ( ; ; )

sprintf(buf, "

accept form %s:%d\n

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

printf(buf,"");

childpid = fork();

if (childpid == 0) else

if (childpid > 0) else

}}void handle(int connfd)

}if (n == 0)

//client exit

if (strncmp("

exit

", buf, 4) == 0)

for(int i=0;ibuf[i]=toupper(buf[i]);

write(connfd, buf, n); //

write maybe fail,here don't process failed error} }

(也可以用telnet 127.0.0.1 6888)代替客戶端
**如下:

#include  #include  /*

basic system data types

*/#include /*

basic socket definitions

*/#include in.h> /*

sockaddr_in{} and other internet defns

*/#include /*

inet(3) functions

*/#include /*

gethostbyname function

*/#include #include #include #include

#define maxline 1024

void handle(int connfd);

int main(int argc, char **argv)

if (argc == 3)

if (argc > 3)

connfd = socket(af_inet, sock_stream, 0);

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = af_inet;

servaddr.sin_port = htons(servport);

inet_pton(af_inet, servinetaddr, &servaddr.sin_addr);

if (connect(connfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)

printf("

welcome to echoclient\n

"); handle(connfd); /*

do it all

*/ close(connfd);

printf("

exit\n

"); exit(0);

}void handle(int sockfd)

/*//也可以不用標準庫的緩衝流,直接使用系統函式無快取操作

if (read(stdin_fileno, sendline, maxline) == 0)

*/ n = write(sockfd, sendline, strlen(sendline));

n = read(sockfd, recvline, maxline);

if (n == 0)

write(stdout_fileno, recvline, n);

//如果用標準庫的快取流輸出有時會出現問題

//fputs(recvline, stdout);}}

編譯和啟動伺服器:

gcc echoserver.c -o echoserver    (使用g++)

./echoserver

編譯和啟動客戶端

gcc echoclient.c -o echoclient    (也可以用telnet 127.0.0.1 6888)代替客戶端

./echoclient

Epoll實現伺服器高併發

最近在做乙個關於高併發伺服器相關的專案需要用到非同步 非阻塞io通訊,實現高tcp併發。以下用epoll技術實現乙個簡單的tcp高併發伺服器,驗證無業務處理的情況下,epoll處理併發連線的數的效果。include include include include include include in...

基於epoll的簡單高併發伺服器程式

epoll,select,poll都是基於linux unix的io復用技術。所謂io復用簡單來說就是讓核心來告知我們哪些檔案描述符讀或寫準備就緒。具體定義大家可以查閱各類書籍。epoll相對於select和poll來說對核心資源的利用更高效,因為select和poll是需要將帶有檔案描述符的資料結...

基於epoll的併發伺服器程式設計

這一篇文章主要是理清伺服器和客戶端的建立通訊的流程,整個通訊是在網路層 即ip協議以及其上的傳輸層和應用層 不明白的話需要先了解網路7層模型 對應的報文格式和不同層的封裝。下面主要圍繞圖11 14講述並深入 serverfd socket af inet,sock stream,0 這裡返回的描述符...