VS2013下由于字符集不同导致的C/S通信错误解决方案

感谢百度贴吧 @啊感叹号祖国  @沧海_月时代   给予的指点


由于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内容出自百度贴吧   @啊感叹号祖国    

另感谢@沧海_月时代   给予的指点


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值