感谢百度贴吧 @啊感叹号祖国 @沧海_月时代 给予的指点
由于VS2013默认采用Unicode字符集,但是网络通信默认多字符集,所以会有些意想不到的问题出现。。
客户端的send代码:
void CChatClientDlg::OnBnClickedSend()
{
UpdateData(TRUE);
m_ClientSocket.Send(m_sWords, m_sWords.GetLength());
m_ListWords.AddString( _T("发送:") + m_sWords);
m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1);
}
服务器端的接收代码:
void CServerSocket::OnReceive(int nErrorCode)
{
CAsyncSocket::OnReceive(nErrorCode);
char szTemp[200];
int n=Receive(szTemp , 200 );
szTemp[n]='\0';
CString sTemp ;
sTemp.Format( _T("收到:%s") , szTemp);
((CChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.AddString( sTemp );
((CChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.SetTopIndex(
((CChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.GetCount()-1 );
}
这样的话,运行结果为
本来的“解决方案管理”,只剩下了“解决方”。
解决方案:
发送端代码中:
m_ClientSocket.Send(m_sWords, m_sWords.GetLength());
// m_sWords是要发送的数据,测试数据为“解决方案管理”
客户端的send发送以后,返回值为发送数据的总数,就是6.
数据正常发送
但是接收代码
int n = Receive(szTemp , 200 );
返回值为接收到的数据字符数。
得到n=6。
szTemp的数据就成了{ 解(第0 1个字符) 决 (第 2 3个字符 ) 方(第4 5 个字符) \0(第6个字符 ) ...... }
这时候要发送的数据只能显示一半。。
所以改正的方法就是:
在客户端的send代码中,
m_ClientSocket.Send(m_sWords, 2 * m_sWords.GetLength());
让发送字符数是数据长度为2倍。
这时接收代码的 n=12.
0-11的缓存区就可以把“解决方案管理”六个字符完全显示出来了。。
这个实例出自Visual C++网络编程教程(Visual Studio 2010平台)郑阿奇主编
PS:但是单纯的 2* 很不可靠。
应该把unicode转化为WCHAR,然后再乘以sizeof(WCHAR)会比较可靠,
安全做法应该是把
LPCTSTR pText=(LPCTSTR)m_sWords;
m_ClientSocket.Send(pText, sizeof(TCHAR) * m_sWords.GetLength());
------PS内容出自百度贴吧 @啊感叹号祖国
另感谢@沧海_月时代 给予的指点