我做的是一个简单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;只有前几个字符能正常显示
比如:
小王-->进  后面的都是乱码
小王说: 后面的也是乱码
本人没分了 希望大侠多多指点

解决方案 »

  1.   

    乱码是咋回事。。不过,这种发送接收方式可能是有问题的。接收方不知道接收的数据的完整长度,所以有可能一句话被拆开来AddString,也有可能几句话被合在一起AddString。应该加个消息头指明本次发送的数据的长度。接收方可以根据这个长度来确认是不是收到了一句完整的聊天记录,如果是的话再AddString。如果不完整,则缓存起来,等待收下一包数据后再处理。
      

  2.   

     
    buffer[num] = 0; 
    加上buffer[num+1] =0;因为你的工程是unicode,空字节要占两位。
    改为多字节就只需一句了
    还有一种方法:
    定义TCHAR *P = (TCHAR *)buffer;
    *(p + num / (sizeof(THCAR)/sizeof(char))) = 0;
      

  3.   

    还有个大问题,就是如果num是单数,就是说一个汉字只接收了一半,麻烦就大了.
    办法有:1。阻塞接收,
          2。在数据报头四个字节为包长。
          一般的写法是,在数据包头前若干个字节包含了一个整包长度的int 
    bool blState = true; 
    while(blState ) 

    int nLen = recv(...) 
    int nPacketLen = 截取出整个数据包的长度。 
    if(nPacketLen > nLen ) 

      //说明包没有接收完整,继续接受 
        continue; 

    else 

        blState = false; 


       3。
           用原始套接字接收
      

  4.   


     
    int totallen =0;
    while(1 ) 

    int nLen = recv(...) 
    int nPacketLen = 截取出整个数据包的长度。
    totallen += nLen; 
    if(nPacketLen > totallen ) 

      //说明包没有接收完整,继续接受 
        continue; 

    else 

        break;

    }小错误呵呵
      

  5.   

    把你的工程(Server & Client)设置成UNICODE
      

  6.   


    //socket 根本不支持unicode,要转成双字节字符串.
      

  7.   

    要知道每次recv的时候有可能是部分包,整个包,或者多个包.............
      

  8.   

    乱码的出现也可能是因为没有初始化BUFFER,你可以检查一下!socket的send,recv等都有自己默认的发送/接收缓存,你应该使用循环来确保将所有的数据发送/接收完毕
      

  9.   

    应该是UNICODE问题,我也碰到跟你一样的情况。出现乱码。
    后来我把UNICODE取消了就可以了
      

  10.   

    要是再不行就:
    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; 
      

  11.   

    char buffer[1024]=""; 
    int num = recv(m_SockClient, buffer, 1024, 0);
    为什么要加buffer[num]=0;//不要它
    CString str;
    str=buffer;
    AfxMessageBox(str);