通过套接字接收的数据不能用于C++

Data received via sockets can't be used C++

本文关键字:数据 不能 用于 C++ 套接字      更新时间:2023-10-16

所以我得到了套接字通信,并且我得到了正确的消息。。。然而,当我试图从接收缓冲区中提取它时。。。它不起作用。我的代码看起来像这样:

void CClientSocket::OnReceive(int nErrorCode) 
{
    char buff[1000];
    int ibuf = Receive(buff,sizeof(buff));
    buff[sizeof(buff)-1] ='';
    CSocket::OnReceive(nErrorCode);
}

当我在调试中运行时,buff的值包含正确的消息。。。以及填充阵列的未使用部分的一堆随机字符。然而,我不能使用这些数据。。。如果我尝试转换为CString,甚至将字符传输到不同的数组。。。什么都不管用。我很困惑,真的不知道该怎么办。

如果你需要更多信息,或者我在任何方面都不清楚,请告诉我。

EDIT:我尝试提取数据的一些代码

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] ='';

将零字节放在buff[ibuf],而不是第二行。但在此之前,添加一个错误检查(确保ibuf > 0,如果不是,则将其视为连接断开。)此外,如果你这样做,你应该使用Receive(buff, sizeof(buff)-1);(注意-1-这说明了终止字符-感谢@Altnitak指出这一点。)

另一方面。。。我还认为,这不是处理套接字代码的方法。字符串不是通过网络以原子方式发送的。他们将被分开。如果您控制协议,我建议您离开以字符串为中心的宇宙视图,并构建您的网络通信,使消息以一个整数(uint16_tuint32_t,并确保调用htons/htonl等)开始,指示随后的有效载荷的长度。然后继续缓冲传入的字节,并在有足够的字节满足指定长度时对其进行处理。

如果你不控制协议,找到一个方便的标记,你可以用它来决定何时处理内容,并缓冲字节,直到你到达它

相关文章: