所以我正在获取套接字通信,并且我正在获取正确的消息...但是当我尝试从接收缓冲区中提取它时...它不起作用。我的代码看起来像这样:
void CClientSocket::OnReceive(int nErrorCode)
{
char buff[1000];
int ibuf = Receive(buff,sizeof(buff));
buff[sizeof(buff)-1] ='\0';
CSocket::OnReceive(nErrorCode);
}
当我在调试中运行时,buff 的值包含正确的消息...以及填充数组未使用部分的一堆随机字符。但是,我无法使用该数据...如果我尝试转换为 CString 或什至将字符传输到不同的数组...没有任何效果。我很困惑,我真的不知道该怎么办。
如果您需要更多信息或者我有任何不清楚的地方,请告诉我。
编辑:一些我试图提取数据的代码
CString string;
string = CString(buff);
和
char *msg;
msg = new char[ibuf]
for(int i = 0; i < ibuf; i++){
msg[i] = (char)buff[i];
}
编辑:一些说明 当我说“没有任何效果”时,我的意思是当我尝试转换它时,结果是空 CString 或空 char 等...没有错误。
最佳答案
int ibuf = Receive(buff,sizeof(buff));
buff[sizeof(buff)-1] ='\0';
而不是第二行,将零字节放在 buff[ibuf]
处。但在此之前,添加错误检查(确保 ibuf > 0
,如果不是,则将其视为连接断开。)此外,如果您这样做,您应该 Receive(buff, sizeof(buff)-1);
(注意 -1
- 这说明了终止字符 - 感谢@Altnitak 指出这一点。)
另一方面...我也认为这不是处理套接字代码的方法。字符串不会通过网络自动发送。他们将 split 。如果您控制协议(protocol),我建议您离开以字符串为中心的宇宙观,并构建您的网络通信,以便消息以整数(uint16_t
或 uint32_t
,并确保调用 htons
/htonl
等)指示后面的有效载荷的长度。然后继续缓冲传入的字节,并在您有足够的字节来满足指定的长度时处理它们。
如果您不控制协议(protocol),请找到一个方便的标记,您可以使用它来决定何时处理内容,并在您到达之前缓冲字节。 (例如,如果您正在执行 HTTP,您可能会缓冲字符,直到在处理 header 时看到换行符,然后为响应内容确定特定的缓冲区大小...)
关于c++ - 通过套接字接收的数据不能使用 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9416705/