void CServerSocket::OnReceive(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
CAsyncSocket::OnReceive(nErrorCode);
char szTemp[30];
int n = Receive(szTemp , 30 );
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 );
}
6 个解决方案
#1
查过相关资料,例如使用A2T什么的,但是都无法解决问题。
#2
自顶一个。求不沉。。
#3
Client与server工程都用同一种字符集编译。多字节或unicode
#4
如果是字符集问题导致乱码,一个字都不会对,既然前几个字对了,那就是发送或者接收数据不全
试了一下果然如此,“解决方찀쳌理”,中间那两个符号是0x00 0xcc 0xcc 0xcc,就是说只收到了六个字节,第七个字节被赋了0但unicode每个字符是两字节,第八个字节依然是栈中VS调试模式下自动填充的0xcc,结果就这样了
试了一下果然如此,“解决方찀쳌理”,中间那两个符号是0x00 0xcc 0xcc 0xcc,就是说只收到了六个字节,第七个字节被赋了0但unicode每个字符是两字节,第八个字节依然是栈中VS调试模式下自动填充的0xcc,结果就这样了
#5
问题解决了,问题出在发送端。。
m_ClientSocket.Send(m_sWords, m_sWords.GetLength());
// m_sWords是要发送的数据,测试数据为“程序设计”
客户端的send发送以后,返回值为发送数据的总数,就是4.
数据正常发送
但是接收代码
int n = Receive(szTemp , 30 );
得到n=4。
szTemp的数据就成了{ 程(第0 1个字符) 序 (第 2 3个字符 ) \0(第4个字符 ) ...... }
这时候要发送的数据只能显示一半。。
所以改正的方法就是:
m_ClientSocket.Send(m_sWords, 2 * m_sWords.GetLength());
让发送是数据长度为2倍。
这时接收代码的 n=8.
0-7的缓存区就可以把“程序设计”四个字符完全显示出来了。。
m_ClientSocket.Send(m_sWords, m_sWords.GetLength());
// m_sWords是要发送的数据,测试数据为“程序设计”
客户端的send发送以后,返回值为发送数据的总数,就是4.
数据正常发送
但是接收代码
int n = Receive(szTemp , 30 );
得到n=4。
szTemp的数据就成了{ 程(第0 1个字符) 序 (第 2 3个字符 ) \0(第4个字符 ) ...... }
这时候要发送的数据只能显示一半。。
所以改正的方法就是:
m_ClientSocket.Send(m_sWords, 2 * m_sWords.GetLength());
让发送是数据长度为2倍。
这时接收代码的 n=8.
0-7的缓存区就可以把“程序设计”四个字符完全显示出来了。。
#6
不过这样单纯的用 2* 很不好。。
应该把unicode转化为WCHAR,然后再乘以sizeof(WCHAR)会比较可靠,
安全做法应该是把
LPCTSTR pText=(LPCTSTR)m_sWords;
m_ClientSocket.Send(pText, sizeof(TCHAR) * m_sWords.GetLength());
------上文出自百度贴吧 @啊感叹号祖国
另感谢@沧海_月时代 给予的指点
应该把unicode转化为WCHAR,然后再乘以sizeof(WCHAR)会比较可靠,
安全做法应该是把
LPCTSTR pText=(LPCTSTR)m_sWords;
m_ClientSocket.Send(pText, sizeof(TCHAR) * m_sWords.GetLength());
------上文出自百度贴吧 @啊感叹号祖国
另感谢@沧海_月时代 给予的指点
#1
查过相关资料,例如使用A2T什么的,但是都无法解决问题。
#2
自顶一个。求不沉。。
#3
Client与server工程都用同一种字符集编译。多字节或unicode
#4
如果是字符集问题导致乱码,一个字都不会对,既然前几个字对了,那就是发送或者接收数据不全
试了一下果然如此,“解决方찀쳌理”,中间那两个符号是0x00 0xcc 0xcc 0xcc,就是说只收到了六个字节,第七个字节被赋了0但unicode每个字符是两字节,第八个字节依然是栈中VS调试模式下自动填充的0xcc,结果就这样了
试了一下果然如此,“解决方찀쳌理”,中间那两个符号是0x00 0xcc 0xcc 0xcc,就是说只收到了六个字节,第七个字节被赋了0但unicode每个字符是两字节,第八个字节依然是栈中VS调试模式下自动填充的0xcc,结果就这样了
#5
问题解决了,问题出在发送端。。
m_ClientSocket.Send(m_sWords, m_sWords.GetLength());
// m_sWords是要发送的数据,测试数据为“程序设计”
客户端的send发送以后,返回值为发送数据的总数,就是4.
数据正常发送
但是接收代码
int n = Receive(szTemp , 30 );
得到n=4。
szTemp的数据就成了{ 程(第0 1个字符) 序 (第 2 3个字符 ) \0(第4个字符 ) ...... }
这时候要发送的数据只能显示一半。。
所以改正的方法就是:
m_ClientSocket.Send(m_sWords, 2 * m_sWords.GetLength());
让发送是数据长度为2倍。
这时接收代码的 n=8.
0-7的缓存区就可以把“程序设计”四个字符完全显示出来了。。
m_ClientSocket.Send(m_sWords, m_sWords.GetLength());
// m_sWords是要发送的数据,测试数据为“程序设计”
客户端的send发送以后,返回值为发送数据的总数,就是4.
数据正常发送
但是接收代码
int n = Receive(szTemp , 30 );
得到n=4。
szTemp的数据就成了{ 程(第0 1个字符) 序 (第 2 3个字符 ) \0(第4个字符 ) ...... }
这时候要发送的数据只能显示一半。。
所以改正的方法就是:
m_ClientSocket.Send(m_sWords, 2 * m_sWords.GetLength());
让发送是数据长度为2倍。
这时接收代码的 n=8.
0-7的缓存区就可以把“程序设计”四个字符完全显示出来了。。
#6
不过这样单纯的用 2* 很不好。。
应该把unicode转化为WCHAR,然后再乘以sizeof(WCHAR)会比较可靠,
安全做法应该是把
LPCTSTR pText=(LPCTSTR)m_sWords;
m_ClientSocket.Send(pText, sizeof(TCHAR) * m_sWords.GetLength());
------上文出自百度贴吧 @啊感叹号祖国
另感谢@沧海_月时代 给予的指点
应该把unicode转化为WCHAR,然后再乘以sizeof(WCHAR)会比较可靠,
安全做法应该是把
LPCTSTR pText=(LPCTSTR)m_sWords;
m_ClientSocket.Send(pText, sizeof(TCHAR) * m_sWords.GetLength());
------上文出自百度贴吧 @啊感叹号祖国
另感谢@沧海_月时代 给予的指点