? (1)多路IO轉接服務器也叫做多任務IO服務器,其主要思想是不再由程序自己監聽客戶端連接,取而代之的是由內核替應用程序監視文件,具體實現模型如圖所示:
? ? ? ? ?
當客戶端請求和服務器連接時,內核接收到連接指令,告訴給服務器,服務器和客戶端建立連接即可(不需要執行accept等待阻塞的時間)。當客戶端請求讀命令時,內核接收到到命令,服務器直接讀取客戶端的數據(不需要執行read等待阻塞讀取數據的時間)。當客戶端請求寫數據時,內核接收到寫命令,服務器直接把數據寫給客戶端。將等待時間縮短,內核幫助服務器執行等待工作,解放了服務器。
(2)select函數
? ? ? ?1)select能監聽的文件描述符個數受限與FD_SETSIZE,一般為1024,單純改變進程打開的文件描述符的個數并不能改變select監聽文件個數。
? ? ? ? 2)解決1024一下的客戶端時使用select是很合適的,但如果鏈接客戶端過多,select采用的是輪詢模型,會大大降低服務器響應效率。
? ? ? ? 3)select函數結構
? ? ? ? ? ? ? ? ?#include<sys/select.h>
? ? ? ? ? ? ? ? #include<sys/times.h>
? ? ? ? ? ? ? ? #include<sys/types.h>
? ? ? ? ? ? ? ? #include<unistd.h>
? ? ? ? ? ? ? ? int? select(int? nfds,fd_set? *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *tineout);
? ? ? ? ? ? ? ?參數nfds:監控的文件描述符集里最大文件描述符加1,通過這個參數會告訴內核檢測前多少個文件描述符的狀態。
? ? ? ? ? ? ? ? ? ? ? ?readfds:監控有讀數據到達文件描述符集合,傳入傳出參數
? ? ? ? ? ? ? ? ? ? ? ?writefds:監控有寫數據到達文件描述符集合,傳入傳出參數
? ? ? ? ? ? ? ? ? ? ? exceptfds:監控有異常數據到達文件描述符集合,傳入傳出參數
? ? ? ? ? ? ? ? ? ? ? timeout:定時阻塞監控時間
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.NULL,永遠等下去
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.設置timeval,等待固定時間
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.設置timeval里時間均為0,檢查描述字后立即返回,輪詢
? ? ? ? ? ? ? ? ? ? ? struct? ?timeval{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? long? ? tv_sec;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? long? ? tv_usec;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? };
? ? ? ? ? ? ? ? ? ? ? void? ?FD_CLR(int? fd,fd_set? *set);? ? ? //把文件描述符集合里fd清0;
? ? ? ? ? ? ? ? ? ? ? int? ? ? FD_ISSET(int? fd,fd_set? *set);? ?//測試文件描述符里fd是否置1
? ? ? ? ? ? ? ? ? ? ? void? ?FD_SET(int? fd,fd_set? *set);? ? ?//文件描述符集合里fd置1
? ? ? ? ? ? ? ? ? ? ? void? ? FD_ZERO(fd_set? *set);? ? ? ? ? //文件描述符集合里所有位清0;
? ? ? ? ? ?4)server服務器實現程序
? ? ? ? ? ? ? ??
? ? ? ??
??