下面是我的程序
发送端
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的派生类!
发送端
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的派生类!
str[rec]=0;// <<--------!!!!!!!结束标志。
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这个类也能较好地动态存储接收后的数据。