日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

CSocket详解

發(fā)布時(shí)間:2024/4/11 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CSocket详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

CSocket的用法?
CSocket在CAsyncSocket的基礎(chǔ)上,修改了Send、Recieve等成員函數(shù),?
幫你內(nèi)置了一個(gè)用以輪詢收發(fā)緩沖區(qū)的循環(huán),變成了同步短連接模式。?
短連接應(yīng)用簡(jiǎn)單明了,CSocket經(jīng)常不用派生就可以直接使用,但也?
有些問題:?
1、用作監(jiān)聽的時(shí)候?
曾經(jīng)看到有人自己創(chuàng)建線程,在線程中創(chuàng)建CSocket對(duì)象進(jìn)行Listen、?
Accept,若Accept成功則再起一個(gè)線程繼續(xù)Listen、Accept。。。?
可以說他完全不理解CSocket,實(shí)際上CSocket已經(jīng)內(nèi)置了多線程機(jī)制,?
你只需要從CSocket派生,然后重載OnAccept:

//CListenSocket頭文件 class CListenSocket : public CSocket { public: CListenSocket(HWND hWnd=NULL); HWND m_hWnd; //事件處理窗口 virtual void OnAccept(int nErrorCode); }; //CListenSocket實(shí)現(xiàn)文件 #include "ListenSocket.h" CListenSocket::CListenSocket(HWND hWnd){m_hWnd=hWnd;} void CListenSocket::OnAccept(int nErrorCode) { SendMessage(m_hWnd,WM_SOCKET_MSG,SOCKET_CLNT_ACCEPT,0); CSocket::OnAccept(nErrorCode); } //主線程 ... m_pListenSocket=new CListenSocket(m_hWnd); m_pListenSocket->Create(...); m_pListenSocket->Listen(); ... LRESULT CXxxDlg::OnSocketMsg(WPARAM wParam, LPARAM lParam) { UINT type=(UINT)wParam; switch(type) { case SOCKET_CLNT_ACCEPT: { CSocket* pSocket=new CSocket; if(!m_pListenSocket->Accept(*pSocket)) { delete pSocket; break; } ... } ... } }
  • 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、用于多線程的時(shí)候?
常看到人說CSocket在子線程中不能用,其實(shí)不然。實(shí)際情況是:?
直接使用CSocket動(dòng)態(tài)創(chuàng)建的對(duì)象,將其指針作為參數(shù)傳遞給子線程,?
則子線程中進(jìn)行收發(fā)等各種操作都沒問題。但如果是使用CSocket的?
派生類創(chuàng)建的對(duì)象,就要看你重載了哪些方法,假如你僅僅重載了?
OnClose,則子線程中你也可以正常收發(fā),但不能Close!?
因?yàn)镃Socket是用內(nèi)部循環(huán)做到同步的,并不依賴各OnXxx,它不需?
要與CSocketWnd交互。但當(dāng)你派生并重載OnXxx后,它為了提供消息?
機(jī)制就必須與CSocketWnd交互。當(dāng)你調(diào)用AfxSocketInit時(shí),你的主?
線程會(huì)獲得一個(gè)訪問CSocketWnd的句柄,對(duì)CSocketWnd的訪問是MFC?
自動(dòng)幫你完成的,是被隱藏的。而你自己創(chuàng)建的子線程并不自動(dòng)具?
備訪問CSocketWnd的機(jī)制,所以子線程中需要訪問CSocketWnd的操?
作都會(huì)失敗。?
常看到的解決辦法是不要給子線程傳遞CSocket對(duì)象指針,而是傳遞?
SOCKET句柄,然后在子線程中創(chuàng)建CSocket臨時(shí)對(duì)象并Attach傳入的?
句柄,用完后再Dettach并delete臨時(shí)對(duì)象。俺沒有這么干過,估計(jì)?
是因?yàn)锳ttach方法含有獲取CSocketWnd句柄的內(nèi)置功能。?
俺的解決方案還是使用自定義消息,比如俺不能在子線程中Close,?
那么,俺可以給主線程發(fā)送一條消息,讓主線程的消息處理函數(shù)來?
完成Close,也很方便。

CSocket的運(yùn)作流程?
CSocket一般配合多線程使用,只要你想收發(fā)數(shù)據(jù),你就可以創(chuàng)建一?
個(gè)CSocket對(duì)象,并創(chuàng)建一個(gè)子線程來進(jìn)行收發(fā)。所以被阻塞的只是?
子線程,而主線程總是可以隨時(shí)創(chuàng)建子線程去幫它干活。?
由于可能同時(shí)有很多個(gè)CSocket對(duì)象在工作,所以你一般還要?jiǎng)?chuàng)建一?
個(gè)列表來儲(chǔ)存這些CSocket對(duì)象的標(biāo)識(shí),這樣你可能通過在列表中檢?
索標(biāo)識(shí)來區(qū)分各個(gè)CSocket對(duì)象,當(dāng)然,由于內(nèi)存地址的唯一性,對(duì)?
象指針本身就可以作為標(biāo)識(shí)。?
相對(duì)CAsyncSocket而言,CSocket的運(yùn)作流程更直觀也更簡(jiǎn)單,至于?
CSocketFile、CArchive之類的,似乎也不需要多說什么,就這樣結(jié)?
束吧。

總結(jié)

以上是生活随笔為你收集整理的CSocket详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。