IO模型 三 select 選擇機制

2021-04-19 21:13:45 字數 1838 閱讀 2385

因為這個模型是後來才使用的,差一點就忘記了....這個模型是從unix裡來的,是比較早的一種模型。上次總結的wsaeventselect模型是微軟將其進行改進後的版本。來看一下這個函式宣告:

int select(

intnfds

,                             //忽略

fd_set far*readfds

,        //讀操作

fd_set far*writefds

,       //寫操作

fd_set far*exceptfds

,     //錯誤

const struct timeval far*timeout

//等待的最大時間

);

另外需要看一看幾個操作函式:fd_set ,fd_set,fd_zero,fd_isset

1.fd_set:是乙個結構體:

typedef struct fd_set fd_set;

2.fd_set:是巨集操作看一下整的**:

#define fd_set(fd, set) do /

} /if (__i == ((fd_set far *)(set))->fd_count) /

} /} while(0)

這是winsock2標頭檔案裡的定義,如果沒有看過mfc**,看到這樣的**一定很頭痛,函式操作還可以寫成這樣...

其實它完成的功能就是將fd載入到記錄set裡。

3.#define fd_zero(set) (((fd_set far *)(set))->fd_count=0)

將記錄set清零

4.#define fd_isset(fd, set) __wsafdisset((socket)(fd), (fd_set far *)(set))

檢測fd是否在記錄set裡

好了現在開始例子:

//前三步省略...

//1.winsock2.2初始化

//2.建立套接字 serversock

//3.bind並listen

//4.將建立好的套接字加入記錄陣列裡

fd_set fdsocket;

//清零

fd_zero(&fdsocket);

//將建立好的套接字加入到記錄

fd_set(serversock,&fdsocket);

//開啟執行緒處理通訊事件

handle hthread = (handle)_beginthreadex(0,0,threadproc,this,0,0);

cselectmodeldlg* pdlg = (cselectmodeldlg*)pparam;//得到當前對話方塊的指標

sockaddr_in addrclient;

int nlen = sizeof(sockaddr);

while(1)

}else 

;int nrecv = recv(pdlg->fdsocket.fd_array[i],(char*)szbuf,max_path*sizeof(tchar),0);

if (nrecv >= 0)

pdlg->setdlgitemtext(idc_ed_recv,szbuf);}}

}}}無論**實現還是邏輯方面我認為select比wsaevenselect實現起來要繁瑣一些,建立模型後select需要遍歷判斷,檢驗等操作,所以看個從習慣選擇了。

非同步選擇機制聊天室

本程式在同一執行緒內實現了接收端和傳送端,與上一章多執行緒聊天室 的結果類似 在編寫網路程式時,採用非同步選擇機制可能提高網路應用程式的效能,如果再配合多執行緒,將再進一步提高程式效能 include pragma comment lib,ws2 32.lib if lobyte wsadata.w...

OpenGL選擇機制的一點討論

今天上午和 susu 討論了下 這篇隨筆 中關於選擇和拾取的 發現有下面幾個問題值得思考 1,selectbuff buffer length 是用來存放命中記錄的,在選擇模式下,與拾取矩陣相交的圖元就會被選擇命中,就會將一條命中記錄寫入到選擇陣列中,每個命中記錄包括 selectbuff 0 儲存...

OpenGL選擇機制的一點討論

今天上午和susu討論了下這篇隨筆中關於選擇和拾取的 發現有下面幾個問題值得思考 1,selectbuff buffer length 是用來存放命中記錄的,在選擇模式下,與拾取矩陣相交的圖元就會被選擇命中,就會將一條命中記錄寫入到選擇陣列中,每個命中記錄包括 selectbuff 0 儲存命中發生...