下面是我的程序
发送端
    UpdateData(TRUE);
int len;
AfxMessageBox(m_edit);//内容为"aaaaaaa"
len = m_edit.GetLength();//len=7;
char * set = new char[len];//没有问题!
set = (char *)m_edit.GetBuffer(len); //内容为"aaaaaaa"没有问题!
m_data.Send(set,len); //发送成功! 
接收端
       int rec = 0;
char receivebuf[100];
rec = Receive(receivebuf,100);//由DEBUG可知道rec  = 7
char * str ;//内容为""
//str = (char *)LocalAlloc(LPTR,rec);//也不行!
str = new char[rec];//多分出了好多个字节,str的DEBUG内容为(0x00422ec0 "屯屯屯妄葺葺葺葺葺葺A")
memcpy(str,receivebuf,rec);//str的debug内容为(0x00422ec0 "aaaaaaa葺葺葺葺葺葺軦")
AfxMessageBox(str);//内容为(aaaaaaa葺葺葺葺葺葺軦)
aaaaaaa后面的东西是哪里来的,我不明白!
用的是CSocket的派生类!

解决方案 »

  1.   

    str = new char[rec+1];// <<--------!!!!!!!
    str[rec]=0;// <<--------!!!!!!!结束标志。
      

  2.   

    这问题并不奇怪呀!只能说明你基本功还差火侯1  str = new char[rec];//多分出了好多个字节,str的DEBUG内容为(0x00422ec0 "屯屯屯妄葺葺葺葺葺葺A")
    memcpy(str,receivebuf,rec);//str的debug内容为(0x00422ec0 "aaaaaaa葺葺葺葺葺葺軦")
       你动态分配了一定数量内存时,它返回的是一个首地址,通过这个首地
       址指针你是无法知道你所分配内存究竟有多长,所以有这样的规定:串
       最后一个字符为0. 它用来表明串结束。
        因此,
    rec = Receive(receivebuf,100);//由DEBUG可知道rec  = 7
    char* str = new char[rec+1];
    memcpy(str,receivebuf, rec);
             str[rec] = 0;
    AfxMessageBox(str);2  上面虽然能回答你所提出的问题。但是这种做法并不是正确的。因为你
        需要通过socket发送的数据包并不一定是串,即使是串,遇到unicode
        编码也会有问题,说明白一点。你不能发送数据包含有0的数据。否则
        接收后这种按串处理会丢失掉0后面的数据。    正确的做法是:接收端收数据后应该返回两个字段(一个是缓冲区的首
        指针,另一个就是数据长度。)记住,你始终不能把数据当做串处理。
      
        当然,用CByteArray这个类也能较好地动态存储接收后的数据。