程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> VS2008多線程WinSock通信中常見問題及解決方案

VS2008多線程WinSock通信中常見問題及解決方案

編輯:C++入門知識

問題一、VS2008中,CString轉化為char*時,GetBuffer(m_str.GetLength())等屢試不爽?
解決方案:無奈網友這個函數還好使[大家不用再發帖問了,這是相對較好的解決方案],主要是Unicode和GB2312編碼方式的不同,一般出現在winsock的send或recv函數buf處。可以使用如下函數實現上述功能。

[cpp]
<span style="font-size:18px;">char* CStringToCharArray(CString str) 

    char *ptr; 
#ifdef _UNICODE 
    LONG len; 
    len = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL); 
    ptr = new char [len+1]; 
    memset(ptr,0,len + 1); 
    WideCharToMultiByte(CP_ACP, 0, str, -1, ptr, len + 1, NULL, NULL); 
#else 
    ptr = new char [str.GetAllocLength()+1]; 
    sprintf(ptr,_T("%s"),str); 
#endif 
    return ptr; 

</span> 
問題二、用戶自定義消息的格式模板
解決方案:用戶自定義的消息的格式,只需要在msdn裡輸入ON_MESSAGE即可。

[cpp]
//(1)自定義消息 
#define WM_MYMESSAGE (WM_USER + 100) 
//(2)消息映射 
BEGIN_MESSAGE_MAP(CMyWnd2, CWnd) 
   ON_MESSAGE(WM_MYMESSAGE, OnMyMessage) 
END_MESSAGE_MAP() 
//(3)消息映射函數 
LRESULT CMyWnd2::OnMyMessage(WPARAM wParam, LPARAM lParam) 

   UNREFERENCED_PARAMETER(wParam); 
   UNREFERENCED_PARAMETER(lParam); 
 
   // Handle message here. 
 
   return 0; 

 

問題三、同步異步套接字的本質區別?
解決方案:

套接字

阻塞/非阻塞

效率

特征

同步套接字

阻塞

較低

執行Winsock函數會一直等待

異步套接字

非阻塞

Winsock函數立即返回,采取基於消息的異步存取策略,

異步選擇函數WSAAsyncSelect提供了消息機制的網絡事件選擇,一旦有數據到來就會觸發相應的事件,操作系統會通過一個消息來通知調用線程,後者可以在消息響應函數中接收這個數據。


[cpp] 
<pre class="cpp" name="code"> </pre> 
<pre></pre> 


作者:wojiushiwo987

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved