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

时间:2012-02-23 16:06:28

标签: c++ sockets networking

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

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等......没有错误。

1 个答案:

答案 0 :(得分:4)

int ibuf = Receive(buff,sizeof(buff));
buff[sizeof(buff)-1] ='\0';

而不是第二行,将零字节放在buff[ibuf]。但在此之前,请添加错误检查(确保ibuf > 0,如果没有,则将其视为连接丢弃。)此外,如果您这样做,则应Receive(buff, sizeof(buff)-1);(请注意-1 } - 这解释了终止字符 - 感谢@Altnitak指出这一点。)

另一方面......我也认为这不是处理套接字代码的方法。字符串不是通过网络原子发送的。他们将分开。如果您控制协议,我建议您离开以字符串为中心的Universe视图,并构建网络通信,以便消息以整数(uint16_tuint32_t开头,并确保调用{ {1}} / htons等)表示随后的有效载荷的长度。然后保持缓冲传入的字节并在足够满足指定的长度时处理它们。

如果您不控制协议,请找到一个方便的标记,您可以使用该标记来决定何时处理内容,并缓冲字节直到您到达它。 (例如,如果您正在执行HTTP,则可能会缓冲字符,直到您在处理标题时看到换行符,然后确定响应内容的某个缓冲区大小...)