用基本的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 說明已經處理完客戶端...