1.请把char buf[1000];清空memset()
2.接收数据流出最后‘\0’的位置,不然字符串没有结尾,就会有问题,接收999字节,不要1000

解决方案 »

  1.   

    VOID mysocket::OnReceive(int nConnectCode)
    {
    char buf[1000];
    // CString streV;
    int flen;
    flen=newsocket->Receive(buf,1000);
    buf[flen]="\0";
    CString streV(buf);
    Dlg->Display(streV);
    CSocket::OnReceive(nConnectCode);
    }
    其中newsocket是在与客户端创立连接后创建的派生类指针,显示用到Display()函数,测试没有问题
    VOID CWifiserverDlg::Display(CString infoM)
    {
    m_client+=infoM;
    m_client+="\r\n";//换行回车
    UpdateData(FALSE);
    m_Control_client.LineScroll(m_Control_client.GetLineCount(),0);//显示控件
    }
      

  2.   

    1、在通信中接收事件是一个很重要的处理事件,最好不要延迟,因此,不要将显示与接收放在同一个线程中处理。可以将通信做成一个独立线程,在主控程序完成显示,当收到数据后用消息将数据传送给主控程序显示。
    2、注意字符串的制式,现在编译器多为Unicode,如果传送的字符为ANSI就必须在显示前进行转换。以下2个转换函数供参考:
    .H // ANSI To UNCODE转换
    CString AnsiToUnicode(char * szAnsi, int len=0);
    // Unicod To ANSI转换
    int UnicodToAnsi(CString str,char* buff);.CPP// ANSI To UNCODE转换
    CString CXXXX::AnsiToUnicode(char * szAnsi, int len)
    {
    CString str;
    // ansi to unicode
    //预转换,得到所需空间的大小
    int wcsLen;
    if(len>0)
    wcsLen=len;
    else
    wcsLen= ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);
    //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
    wchar_t* wszString = new wchar_t[wcsLen + 1];
    //转换
    ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);
    //最后加上'\0'
    wszString[wcsLen] = '\0'; // UNICODE字串
    str=wszString;
    delete wszString;
    return str;
    }// Unicod To ANSI转换
    int CXXXX::UnicodToAnsi(CString str,char* buff)
    {
    int len=0;
    // UNICODE编码 转换成 ANSI编码
    len = ::WideCharToMultiByte(CP_ACP, NULL, str, 
    str.GetLength(), NULL, 0, NULL, NULL); // 取字串长度
    ::WideCharToMultiByte(CP_ACP, NULL, str, str.GetLength(), 
    buff, len, NULL, NULL);
    buff[len++]=0x00; // 写字串尾部结束标志 return len; // 转换长度
    }