最近重溫一下windows的網路模型(windows網路與通訊程式設計),發現大多數的select模型都會做乙個遍歷,然後處理對應的資料。裡面提到了一點:(2)將fdsocket 集合的拷貝fdread 傳遞給select 函式,當有事件發生時,select 函式移除fdread 集合中沒有未決i/o 操作的套接字控制代碼,然後返回。
值得注意的是:select 函式移除fdread 集合中沒有未決i/o 操作的套接字控制代碼 那麼返回的fdread集合就是需要處理的socket了,基於這一點那麼就不必用這個迴圈for(int i=0; i<(int)fdsocket.fd_count; i++) 然後對比較原來fdsocket 集合與select 處理過的fdread 集合 也就是這個比較就沒有意義了if(fd_isset(fdsocket.fd_array[i], &fdread))。
那麼我們可以直接用 for (int i = 0; i < (int)fdread.fd_count; i++) 來處理所有未決i/o 操作的套接字,可以大大提高效率。**如下:
#include #include #include #include using namespace std;
typedef struct stclientinfo
clientinfo;
typedef mapclientlist;
clientlist g_clilist;
class cinitsock
}~cinitsock()
};cinitsock thesock;
int main()
//進入監聽模式
if (::listen(slisten, 5) == 0)
//select 模型處理過程
//1 初始化乙個套接字集合 fdsocket ,將監聽套接字新增進去
fd_set fdsocket;
fd_zero(&fdsocket);
fd_set(slisten, &fdsocket);
char szbuf[1024]; //資料緩衝區
while (true)
else
}else
{memset(szbuf, 0, 1024);
int nrecv =::recv(fdread.fd_array[i], szbuf, 1024, 0);
if (nrecv > 0)
{clientlist::iterator it=g_clilist.find(fdread.fd_array[i]);
cout << "[+]recv " 網路程式設計之select模型 一.設計思想 利用select函式,判斷套接字上是否存在資料,或者能否向乙個套接字寫入資料。目的是防止應用程式在套接字處於鎖定模式時,呼叫recv 或send 從沒有資料的套接字上接收資料,被迫進入阻塞狀態。二.select函式 2.1 select函式 int se... 一 作用 向目標傳送資料,本質上就是將資料複製貼上進系統的協議傳送緩衝區,計算機伺機傳送出去 二 句法int wsaapi send socket s,const char buf,int len,int flags s 標識已連線套接字的描述符。buf 指向包含要傳輸的資料的緩衝區的指標。len ... 網路程式設計 1.乙個程式如何在網路上找到另乙個程式?首先,程式必須要啟動,其次,必須有這台機器位址,我們都知道我們人的位址大概就是國家 省 市 區 街道 樓 門牌號這樣子。那麼每一台聯網的機器在網路上也有自己的位址,他們位址是怎麼表示的呢?就是使用一串數字來表示的,例如 100.4.5.6什麼是i...windows網路程式設計之Select模型基礎知識
Windows網路程式設計之send 函式
網路程式設計 之 網路基礎