所以我得到了套接字通信,而且我得到了正确的消息......但是当我尝试从接收缓冲区中提取它时......它不起作用。我的代码看起来像这样:
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等......没有错误。
答案 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_t
或uint32_t
开头,并确保调用{ {1}} / htons
等)表示随后的有效载荷的长度。然后保持缓冲传入的字节并在足够满足指定的长度时处理它们。
如果您不控制协议,请找到一个方便的标记,您可以使用该标记来决定何时处理内容,并缓冲字节直到您到达它。 (例如,如果您正在执行HTTP,则可能会缓冲字符,直到您在处理标题时看到换行符,然后确定响应内容的某个缓冲区大小...)