将主机字节顺序转换为网络字节顺序有时会导致奇怪的结果
Converting the host byte order to network byte order sometimes results in odd results
我目前正在用 android 客户端使用的 c++ 编写服务器。基本上我使用 googles protocol buffers 进行数据传输,在发送 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)。
我是不是漏掉了什么?如果您需要更多信息或更多代码,请索取,我会 post 然后。
您用 htonl()
的结果覆盖了 packageSize
的值:
packageSize = htonl(packageSize);
然后将其用作传递给 send()
:
的包大小
send(con.sockfd, data.c_str(), packageSize, 0)
将转换后的值保存在不同的变量中。并且不要使用临时字符缓冲区:
bool Client::sendOnePackage(const std::string & data) {
int32_t packageSize = data.length();
int32_t conv_size = htonl(packageSize);
if (send(con.sockfd, reinterpret_cast<char*>(&conv_size), sizeof (int32_t), 0) == sizeof (int32_t)) {
if (send(con.sockfd, data.c_str(), packageSize, 0) == packageSize) { //use original size
return true;
}
}
return false;
}
我目前正在用 android 客户端使用的 c++ 编写服务器。基本上我使用 googles protocol buffers 进行数据传输,在发送 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)。
我是不是漏掉了什么?如果您需要更多信息或更多代码,请索取,我会 post 然后。
您用 htonl()
的结果覆盖了 packageSize
的值:
packageSize = htonl(packageSize);
然后将其用作传递给 send()
:
send(con.sockfd, data.c_str(), packageSize, 0)
将转换后的值保存在不同的变量中。并且不要使用临时字符缓冲区:
bool Client::sendOnePackage(const std::string & data) {
int32_t packageSize = data.length();
int32_t conv_size = htonl(packageSize);
if (send(con.sockfd, reinterpret_cast<char*>(&conv_size), sizeof (int32_t), 0) == sizeof (int32_t)) {
if (send(con.sockfd, data.c_str(), packageSize, 0) == packageSize) { //use original size
return true;
}
}
return false;
}