因為這個模型是後來才使用的,差一點就忘記了....這個模型是從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 儲存命中發生...