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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CSocket详解

發布時間:2024/4/11 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CSocket详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

//CListenSocket頭文件 class CListenSocket : public CSocket { public: CListenSocket(HWND hWnd=NULL); HWND m_hWnd; //事件處理窗口 virtual void OnAccept(int nErrorCode); }; //CListenSocket實現文件 #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、用于多線程的時候?
常看到人說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之類的,似乎也不需要多說什么,就這樣結?
束吧。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。