关于SOCKET send发送乱码问题

zyboy032 2009-08-28 02:48:26
我做的是一个简单C/S的聊天室程序

发送代码:

CString strname, info;
((CEdit*)GetDlgItem(IDC_EDIT3))->GetWindowText(strname);
info.Format(_T("%s-->进入聊天室."),strname);
send(m_SockClient, (char*)info.GetBuffer(), info.GetLength() + 1, 0);

info.Format(_T("%s 说 : %s"),name, strData);
send(m_SockClient, (char*)info.GetBuffer(), info.GetLength() + 1, 0);
m_MsgList.AddString(info); //直接加入ListBox能正常显示
((CEdit*)GetDlgItem(IDC_EDIT5))->SetWindowText(TEXT(""));

接受代码;

char buffer[1024];
int num = recv(m_SockClient, buffer, 1024, 0);
buffer[num] = 0;
m_MsgList.AddString((LPCTSTR)buffer);
return 1;

只有前几个字符能正常显示
比如:
小王-->进 后面的都是乱码
小王说: 后面的也是乱码


本人没分了 希望大侠多多指点
...全文
676 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
foolstone2008 2009-08-29
  • 打赏
  • 举报
回复
uo
hege1983 2009-08-29
  • 打赏
  • 举报
回复
乱码的出现也可能是因为没有初始化BUFFER,你可以检查一下!

socket的send,recv等都有自己默认的发送/接收缓存,你应该使用循环来确保将所有的数据发送/接收完毕
love_lm 2009-08-29
  • 打赏
  • 举报
回复
我来学习下
dinona 2009-08-29
  • 打赏
  • 举报
回复
char buffer[1024]="";
int num = recv(m_SockClient, buffer, 1024, 0);
为什么要加buffer[num]=0;//不要它
CString str;
str=buffer;
AfxMessageBox(str);
dengxuxing 2009-08-29
  • 打赏
  • 举报
回复
要是再不行就:
char buffer[1024];
int num = recv(m_SockClient, buffer, 1024, 0);
CString str="";
for(int i=0;i<num;i++)str+=buffer[i];
m_MsgList.AddString((str);
return 1;
wanjingwei 2009-08-29
  • 打赏
  • 举报
回复
应该是UNICODE问题,我也碰到跟你一样的情况。出现乱码。
后来我把UNICODE取消了就可以了
dirdirdir3 2009-08-28
  • 打赏
  • 举报
回复
要知道每次recv的时候有可能是部分包,整个包,或者多个包.............
dirdirdir3 2009-08-28
  • 打赏
  • 举报
回复
这个情况有可能是包发了一半被你当成整个包放进一个字符串里了。
最好还是前面放一个数字来表示当前的字符数,也可以搞个包头包尾的就更加可靠了............
PoPcl 2009-08-28
  • 打赏
  • 举报
回复

//socket 根本不支持unicode,要转成双字节字符串.
secretcf 2009-08-28
  • 打赏
  • 举报
回复
把你的工程(Server & Client)设置成UNICODE
pady_pady 2009-08-28
  • 打赏
  • 举报
回复


int totallen =0;
while(1 )
{
int nLen = recv(...)
int nPacketLen = 截取出整个数据包的长度。
totallen += nLen;
if(nPacketLen > totallen )
{
//说明包没有接收完整,继续接受
continue;
}
else
{
break;
}
}

小错误呵呵
pady_pady 2009-08-28
  • 打赏
  • 举报
回复
还有个大问题,就是如果num是单数,就是说一个汉字只接收了一半,麻烦就大了.
办法有:1。阻塞接收,
2。在数据报头四个字节为包长。
一般的写法是,在数据包头前若干个字节包含了一个整包长度的int
bool blState = true;
while(blState )
{
int nLen = recv(...)
int nPacketLen = 截取出整个数据包的长度。
if(nPacketLen > nLen )
{
//说明包没有接收完整,继续接受
continue;
}
else
{
blState = false;
}
}
3。
用原始套接字接收
pady_pady 2009-08-28
  • 打赏
  • 举报
回复

buffer[num] = 0;
加上buffer[num+1] =0;

因为你的工程是unicode,空字节要占两位。
改为多字节就只需一句了
还有一种方法:
定义TCHAR *P = (TCHAR *)buffer;
*(p + num / (sizeof(THCAR)/sizeof(char))) = 0;
zyboy032 2009-08-28
  • 打赏
  • 举报
回复
UP
野男孩 2009-08-28
  • 打赏
  • 举报
回复
乱码是咋回事。。

不过,这种发送接收方式可能是有问题的。接收方不知道接收的数据的完整长度,所以有可能一句话被拆开来AddString,也有可能几句话被合在一起AddString。

应该加个消息头指明本次发送的数据的长度。接收方可以根据这个长度来确认是不是收到了一句完整的聊天记录,如果是的话再AddString。如果不完整,则缓存起来,等待收下一包数据后再处理。
zyboy032 2009-08-28
  • 打赏
  • 举报
回复
那怎么做呢?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧