c++ - 通过套接字接收的数据不能使用 C++

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

最佳答案

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_tuint32_t,并确保调用 htons/htonl 等)指示后面的有效载荷的长度。然后继续缓冲传入的字节,并在您有足够的字节来满足指定的长度时处理它们。

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

关于c++ - 通过套接字接收的数据不能使用 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9416705/

相关文章:

c++ - ORB 特征与 C++ 中的 FLANN 匹配

c++ - 如何用 PPM 格式的 uchar* 数组填充 QPixmap

java - 了解 Android 的代码 fragment IP 摄像机

ios - 在 iOS 中为推送通知发送报告

Java 网络服务扫描器

delphi - 网络驱动器上的帮助文件 (.chm) 无法从 delphi(.exe) 应用程序打开

c++ - 在 C++ 中处理 OpenStreetMaps (OSM)

c++ - 为什么 const char[] 和 const char* 的比较不同?

c++ - 如何使用WMI添加IP路由?

networking - eBPF 支持事件吗?