【发布时间】:2015-06-28 08:52:40
【问题描述】:
我目前正在用 C++ 编写一个供 android 客户端使用的服务器。基本上我使用 googles 协议缓冲区进行数据传输,在发送 protobuf 包之前,我以网络字节顺序发送包大小。这是我发送一个包裹的功能:
bool Client::sendOnePackage(const std::string & data) {
int32_t packageSize = data.length();
packageSize = htonl(packageSize);
char packageSizeBuffer[sizeof (int32_t)];
memcpy(packageSizeBuffer, &packageSize, sizeof (int32_t));
if (send(con.sockfd, packageSizeBuffer, sizeof (int32_t), 0) == sizeof (int32_t)) {
if (send(con.sockfd, data.c_str(), packageSize, 0) == packageSize) {
return true;
}
}
return false;
}
然后,android 部分将使用以下方法处理将发送的整数转换为主机字节顺序的包:
int answerLength = ByteBuffer.wrap(answerLengthData).getInt();
现在的问题:当我通过网络发送一个大小为 8 的包时,它工作得很好,android 接收到字节数组 0,0,0,8(总是 4 个字节)。但是当我通过网络发送值 6 时,android 会收到奇数字节数组 0,114,0,0,这会导致异常大的包大小 (7471104)。
我在这里遗漏了什么吗?如果您需要更多信息或更多代码,请索取,然后发布。
【问题讨论】:
-
与此问题无关,但不需要临时字符缓冲区,直接使用整数变量即可。例如。
send(con.sockfd, reinterpret_cast<char*>(&packageSize), sizeof(packageSize), 0) -
您的变量
packageSize被转换为网络字节顺序,然后您尝试将其用作长度。
标签: java android c++ sockets networking