windows網路程式設計之select模型 改進

2021-08-04 18:47:32 字數 1359 閱讀 4815

最近重溫一下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 "

windows網路程式設計之Select模型基礎知識

網路程式設計之select模型 一.設計思想 利用select函式,判斷套接字上是否存在資料,或者能否向乙個套接字寫入資料。目的是防止應用程式在套接字處於鎖定模式時,呼叫recv 或send 從沒有資料的套接字上接收資料,被迫進入阻塞狀態。二.select函式 2.1 select函式 int se...

Windows網路程式設計之send 函式

一 作用 向目標傳送資料,本質上就是將資料複製貼上進系統的協議傳送緩衝區,計算機伺機傳送出去 二 句法int wsaapi send socket s,const char buf,int len,int flags s 標識已連線套接字的描述符。buf 指向包含要傳輸的資料的緩衝區的指標。len ...

網路程式設計 之 網路基礎

網路程式設計 1.乙個程式如何在網路上找到另乙個程式?首先,程式必須要啟動,其次,必須有這台機器位址,我們都知道我們人的位址大概就是國家 省 市 區 街道 樓 門牌號這樣子。那麼每一台聯網的機器在網路上也有自己的位址,他們位址是怎麼表示的呢?就是使用一串數字來表示的,例如 100.4.5.6什麼是i...