CSocket详解
CSocket的用法?
CSocket在CAsyncSocket的基礎(chǔ)上,修改了Send、Recieve等成員函數(shù),?
幫你內(nèi)置了一個用以輪詢收發(fā)緩沖區(qū)的循環(huán),變成了同步短連接模式。?
短連接應(yīng)用簡單明了,CSocket經(jīng)常不用派生就可以直接使用,但也?
有些問題:?
1、用作監(jiān)聽的時候?
曾經(jīng)看到有人自己創(chuàng)建線程,在線程中創(chuàng)建CSocket對象進(jìn)行Listen、?
Accept,若Accept成功則再起一個線程繼續(xù)Listen、Accept。。。?
可以說他完全不理解CSocket,實(shí)際上CSocket已經(jīng)內(nèi)置了多線程機(jī)制,?
你只需要從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在子線程中不能用,其實(shí)不然。實(shí)際情況是:?
直接使用CSocket動態(tài)創(chuàng)建的對象,將其指針作為參數(shù)傳遞給子線程,?
則子線程中進(jìn)行收發(fā)等各種操作都沒問題。但如果是使用CSocket的?
派生類創(chuàng)建的對象,就要看你重載了哪些方法,假如你僅僅重載了?
OnClose,則子線程中你也可以正常收發(fā),但不能Close!?
因?yàn)镃Socket是用內(nèi)部循環(huán)做到同步的,并不依賴各OnXxx,它不需?
要與CSocketWnd交互。但當(dāng)你派生并重載OnXxx后,它為了提供消息?
機(jī)制就必須與CSocketWnd交互。當(dāng)你調(diào)用AfxSocketInit時,你的主?
線程會獲得一個訪問CSocketWnd的句柄,對CSocketWnd的訪問是MFC?
自動幫你完成的,是被隱藏的。而你自己創(chuàng)建的子線程并不自動具?
備訪問CSocketWnd的機(jī)制,所以子線程中需要訪問CSocketWnd的操?
作都會失敗。?
常看到的解決辦法是不要給子線程傳遞CSocket對象指針,而是傳遞?
SOCKET句柄,然后在子線程中創(chuàng)建CSocket臨時對象并Attach傳入的?
句柄,用完后再Dettach并delete臨時對象。俺沒有這么干過,估計(jì)?
是因?yàn)锳ttach方法含有獲取CSocketWnd句柄的內(nèi)置功能。?
俺的解決方案還是使用自定義消息,比如俺不能在子線程中Close,?
那么,俺可以給主線程發(fā)送一條消息,讓主線程的消息處理函數(shù)來?
完成Close,也很方便。
CSocket的運(yùn)作流程?
CSocket一般配合多線程使用,只要你想收發(fā)數(shù)據(jù),你就可以創(chuàng)建一?
個CSocket對象,并創(chuàng)建一個子線程來進(jìn)行收發(fā)。所以被阻塞的只是?
子線程,而主線程總是可以隨時創(chuàng)建子線程去幫它干活。?
由于可能同時有很多個CSocket對象在工作,所以你一般還要創(chuàng)建一?
個列表來儲存這些CSocket對象的標(biāo)識,這樣你可能通過在列表中檢?
索標(biāo)識來區(qū)分各個CSocket對象,當(dāng)然,由于內(nèi)存地址的唯一性,對?
象指針本身就可以作為標(biāo)識。?
相對CAsyncSocket而言,CSocket的運(yùn)作流程更直觀也更簡單,至于?
CSocketFile、CArchive之類的,似乎也不需要多說什么,就這樣結(jié)?
束吧。
總結(jié)
- 上一篇: Windows 系统版本判断
- 下一篇: 0.OD-基础操作