WSAEventselect模型中的一些注意事項(尤其是event和事件的關聯與重置;FD_WRITE事件的作用)
1. 需要包含winsock2.h,連結ws2_32.llib
2. 把#include <winsock2.h>放到最前面
至於原因,那是因為windows.h這個標頭檔案已經包含了winsock.h,winsock.h和winsock2.h貌似有衝突 解釋在:http://vc.ygman.com/thread/47071
3.MSDN中說使用WSAEventSelect模型等待時是不佔cpu時間的,這也是效率比阻塞winsock高的原因;非阻塞模式可以省去send或者recv沒有空間傳送或沒有資料接收時的等待時間;一個執行緒管理多個會話套接字;
4. 同一個事件會不會由於多個網路事件的集合,同時發生兩個網路事件後被遮蔽?
用send做實驗,發現會的。因為在TCP連線開始,會在伺服器端的會話套接字上觸發FD_WRITE事件。如果在會話套接字上監聽FD_READ和FD_WRITE事件,會有如下兩種情況。
第一、實驗在客戶端connect後中斷,那麼在伺服器端就會在接聽套接字接收到FD_ACCEPT事件,隨後在建立的會話套接字上觸發FD_WRITE事件,已經通過單步除錯驗證。
第二、如果在客戶端send後中斷,那麼在伺服器端首先還是在監聽套接字接收到FD_ACCEPT事件,隨後在建立的會話套接字上觸發FD_WRITE事件,這個時候不同的是,由於客戶端傳送資料的緣故,會再這個會話套接字上再觸發FD_READ事件。這時就會出現一個套接字上監聽的多個網路事件同時觸發的問題。因為此時會話套接字上觸發了兩個網路時間,但是在處理的時候WSAEnumNetworkEvents會自動重置這個事件,比如在處理的時候先處理的是FD_READ事件,過去之後這個event就會被重置,所以FD_WRITE時間就無法處理了;如果先處理的是FD_WRITE事件,過去之後這個event還是會被重置,所以這時FD_READ時間就得不到處理了。
5. FD_WIRTE事件的作用?
一直搞不懂 WSAEventSelect 的 FD_WRITE ,不知道怎麼利用他在自己想發資料的時候發資料,後來知道了想發隨時發訊息 要自己另外去寫send方法,FD_WRITE 是用於一開始連線成功侯就開始傳送大批量資料的,比如發一個視訊連線給別人 ,別人接了 那麼這個時候就觸發了FD_WRITE ,視訊的資料會不停的充滿快取,所以FD_WRITE會不停的觸發因為沒人教我 只能靠自己苦苦蔘悟了 希望別的朋友也能看到我的文字,不要 去被 FD_WRITE 煩惱了 想自己隨時發資料的時候 ,自己另外去寫send方法 如果你不是一次性發送大批量資料的話,就別想著使用FD_WRITE事件了,因為如果既希望於在收到FD_WRITE的時候傳送資料,但是又不能傳送足夠多的資料填滿socket緩衝區的話,就只能收到剛剛建連線的時候的第一次事件,之後及不會再收到了,所以當只是傳送儘可能少的資料的時候,忘掉FD_WRITE機制,在任何想傳送資料的時候直接呼叫send傳送吧。