問題一、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>