多路復用之select網路程式設計

2021-09-07 15:46:26 字數 3129 閱讀 8132

用基本的linux/unix基本函式加上select呼叫編寫乙個完整的伺服器和客戶端例子,可在linux(ubuntu)和unix(freebsd)上執行

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

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

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

#include  #include  /* basic system data types */

#include /* basic socket definitions */

#include /* sockaddr_in{} and other internet defns */

#include /* inet(3) functions */

#include /* select function*/

#include #include #include #include #define maxline 10240

void handle(int * clientsockfds, int maxfds, fd_set* prset, fd_set* pallset);

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

int opt = 1;

if (setsockopt(listenfd, sol_socket, so_reuseaddr, &opt, sizeof(opt)) < 0)

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = af_inet;

servaddr.sin_addr.s_addr = htonl(inaddr_any);

servaddr.sin_port = htons(servport);

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

if (listen(listenfd, listenq) < 0)

int i = 0;

for (i = 0; i< fd_setsize; i++)

clientsockfds[i] = -1;

fd_zero(&allset);

fd_set(listenfd, &allset);

maxfd = listenfd;

printf("echo server use select startup, listen on port %d\n", servport);

printf("max connection: %d\n", fd_setsize);

for ( ; ; )

if (fd_isset(listenfd, &rset))

sprintf(buf, "accept form %s:%d\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port);

printf(buf, "");

for (i = 0; i< fd_setsize; i++)

}if (i == fd_setsize)

if (connfd > maxfd)

maxfd = connfd;

fd_set(connfd, &allset);

if (--nready <= 0)

continue;

}handle(clientsockfds, maxfd, &rset, &allset);

}}void handle(int * clientsockfds, int maxfds, fd_set* prset, fd_set* pallset)

if (nread == 0)

write(clientsockfds[i], buf, nread);//響應客戶端 有可能失敗,暫不處理}}

}}

#include  #include  /* basic system data types */

#include /* basic socket definitions */

#include /* sockaddr_in{} and other internet defns */

#include /* inet(3) functions */

#include /* select function*/

#include #include #include #include #define maxline 10240

#define max(a,b) ((a) > (b) ? (a) : (b))

//typedef struct sockaddr sa;

void handle(int sockfd);

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

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 selectechoclient\n");

handle(connfd); /* do it all */

close(connfd);

printf("exit\n");

exit(0);

}void handle(int connfd)

if (fd_isset(connfd, &rset))

else if (nread == -1)

else

}if (fd_isset(fileno(fp), &rset))

else }}

}

I O多路復用之select

阻塞i o模型 應用程式呼叫乙個i o函式,應用程式會一直等待資料準備好。如果資料沒有準備好,就會一直等待。只有當資料準備好,從核心拷貝到使用者空間io函式才成功返回。非阻塞i o模型 把乙個套介面設定成非阻塞告訴核心,當所有的i o操作無法完成時,不要將程序睡眠,而返回乙個錯誤資訊。此時i o操作...

IO多路復用之select

1 背景知識 我們首先來看看伺服器程式設計的模型,客戶端發來的請求服務端會產生乙個程序來對其進行服務,每當來乙個客戶請求就產生乙個程序來服務,然而程序不可能無限制的產生,因此為了解決大量客戶端訪問的問題,引入了io復用技術。即 乙個程序可以同時對多個客戶請求進行服務。也就是說io復用的 介質 是程序...

LinuxIO多路復用之select

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