select伺服器實際上是對於用來標識檔案描述符狀態(「等」的狀態結束 或正在「等」)的 fd_set變數 ret 進行檢測(即select函式),對於已經完成「等」狀態的檔案描述符,即將開始i/o操作並不存在阻塞的問題,這樣就大大提高了伺服器執行效率
對於檔案描述符集的操作函式有
fd_zero(fd_set* ret)
其功能: 初始化fd(標誌位全部置0)
select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout)
其中 nfds 是需要監視的最大的檔案描述符+1
readfds、writefds、exceptfds分別代表可讀檔案描述符集合,可寫檔案描述符集合,異常檔案描述符集合
timeout 用於描述一段時間長度,如果在這個時間內需要監視的檔案描述符沒有事件發生則函式返回0
重點:三個檔案描述符集合都是輸入輸出型引數,作為輸出時,返回對應事件就緒的檔案描述符集,而select返回後會把以前加入的但並無事件發生的fd清空,基於這一點,我們必須另外建立某種資料結構來儲存狀態改變之前的檔案描述符集的資訊(**中用乙個陣列來儲存相應的資訊)
#include
#include
#include
#include
#include
#include
#include
#include
///static
void usage(const
char* pro)
//套接字的建立 繫結 和 設定監聽狀態,不做解釋
int startup(const
char* _ip, int _port)
// bangding
struct sockaddr_in local;
local.sin_family = af_inet;
local.sin_port = htons(_port);
local.sin_addr.s_addr = inet_addr(_ip);
if(bind(sock, (struct sockaddr*)&local, sizeof(local)) < 0)
// jianting
if(listen(sock, 10) < 0)
return sock;
}//用於儲存監視的檔案描述符集
int fd_array[sizeof(fd_set)*8];
int main(int argc, char* argv)
int listen_sock = startup(argv[1], atoi(argv[2]));
int maxsz = sizeof(fd_array)/sizeof(fd_array[0]);
int i = 0;
//初始化陣列,-1為無效值
for(; i< maxsz; i++)
fd_array[0] = listen_sock;
while(1)
}//for結尾
// 初始化outime
struct timeval outime = ;
//只監視讀事件
int s = select(maxfd+1, &fd, null, null, &outime);
switch(s)
printf("get a new client: %s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
int j = 1;
for(; j < maxsz; ++j)
//伺服器載客量已滿
if(j == maxsz)
else
//其他讀事件就緒,開始讀取資料(new_sock加入陣列後,迴圈開始的地方被新增入需要監視的檔案描述符集,然後在這裡開始處理)
}//other file_desriptor is ready
else
if(i!=0 && fd_isset(fd_array[i], &fd))
else
if(s == 0)
else
}}//for
}//default
break;
}}//while
return
0;}
關於網路伺服器
假如我有數千萬甚至是上億的使用者資料,我想把使用者自增id和使用者名稱username放到快取裡。我的需求是,當要查詢使用者的資訊時,我想先從快取裡根據使用者名稱username獲取到使用者的id,然後再通過id在資料庫裡查詢使用者的資訊。我想當乙個使用者表達到上億的數量級別時,用自增id來查詢肯定...
網路伺服器宕機
1.伺服器程序終止 當伺服器程序終止時,伺服器傳送fin給客戶端,客戶端回以ack,客戶端進入close wait狀態,但還沒有結束連線。此時客戶端阻塞於fgets,客戶端繼續傳送buffer,伺服器傳送rst,客戶端readline返回0。而如果客戶端不理睬readline返回的rst,繼續wri...
linux網路伺服器
在本次中,學習了乙個簡單的基於tcp ip的伺服器 客戶端。在例子中,利用的是af inet域。在linux下,最常用就是af inet,af unix.af unix是linux檔案系統實現的本地要借字。後面的是可以用於包括英特網在內的tcp ip網路通訊的程式。下面來看乙個簡單的基於tcp ip...