CSocket详解
CSocket的用法?
CSocket在CAsyncSocket的基礎上,修改了Send、Recieve等成員函數,?
幫你內置了一個用以輪詢收發緩沖區的循環,變成了同步短連接模式。?
短連接應用簡單明了,CSocket經常不用派生就可以直接使用,但也?
有些問題:?
1、用作監聽的時候?
曾經看到有人自己創建線程,在線程中創建CSocket對象進行Listen、?
Accept,若Accept成功則再起一個線程繼續Listen、Accept。。。?
可以說他完全不理解CSocket,實際上CSocket已經內置了多線程機制,?
你只需要從CSocket派生,然后重載OnAccept:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
2、用于多線程的時候?
常看到人說CSocket在子線程中不能用,其實不然。實際情況是:?
直接使用CSocket動態創建的對象,將其指針作為參數傳遞給子線程,?
則子線程中進行收發等各種操作都沒問題。但如果是使用CSocket的?
派生類創建的對象,就要看你重載了哪些方法,假如你僅僅重載了?
OnClose,則子線程中你也可以正常收發,但不能Close!?
因為CSocket是用內部循環做到同步的,并不依賴各OnXxx,它不需?
要與CSocketWnd交互。但當你派生并重載OnXxx后,它為了提供消息?
機制就必須與CSocketWnd交互。當你調用AfxSocketInit時,你的主?
線程會獲得一個訪問CSocketWnd的句柄,對CSocketWnd的訪問是MFC?
自動幫你完成的,是被隱藏的。而你自己創建的子線程并不自動具?
備訪問CSocketWnd的機制,所以子線程中需要訪問CSocketWnd的操?
作都會失敗。?
常看到的解決辦法是不要給子線程傳遞CSocket對象指針,而是傳遞?
SOCKET句柄,然后在子線程中創建CSocket臨時對象并Attach傳入的?
句柄,用完后再Dettach并delete臨時對象。俺沒有這么干過,估計?
是因為Attach方法含有獲取CSocketWnd句柄的內置功能。?
俺的解決方案還是使用自定義消息,比如俺不能在子線程中Close,?
那么,俺可以給主線程發送一條消息,讓主線程的消息處理函數來?
完成Close,也很方便。
CSocket的運作流程?
CSocket一般配合多線程使用,只要你想收發數據,你就可以創建一?
個CSocket對象,并創建一個子線程來進行收發。所以被阻塞的只是?
子線程,而主線程總是可以隨時創建子線程去幫它干活。?
由于可能同時有很多個CSocket對象在工作,所以你一般還要創建一?
個列表來儲存這些CSocket對象的標識,這樣你可能通過在列表中檢?
索標識來區分各個CSocket對象,當然,由于內存地址的唯一性,對?
象指針本身就可以作為標識。?
相對CAsyncSocket而言,CSocket的運作流程更直觀也更簡單,至于?
CSocketFile、CArchive之類的,似乎也不需要多說什么,就這樣結?
束吧。
總結
- 上一篇: Windows 系统版本判断
- 下一篇: 0.OD-基础操作