【问题标题】:reading in C++ a socket open by Java + structure alignment在 C++ 中读取由 Java + 结构对齐打开的套接字
【发布时间】:2010-07-16 09:47:37
【问题描述】:

我正在尝试使用来自套接字的boost::asio 数据在 Linnux 中编写 C++ 客户端。服务器是用 Java 构建的。我现在遇到的问题是我无法从套接字正确读取某些信息。如果客户端是用 JAVA 完成的,一切正常。

详细来说,我在接收以下结构中的unsigned longint 时遇到的大错误。我期望anInteger 的值应该是0x00000005 所以5,但是从套接​​字读取给我0x03000(?!?!)。它绝对是一个不同的数字,并且基于十六进制打印,我的数字更少(?!?!?)。

对于aUnLong,我应该收到接近数字 1279272977799 的东西,所以十六进制是0x129DA9C8587,而不是收到类似0x00129ffffffdaffffff8fffffff9f5c 的东西。我看到一些信息很好,但它与所有ffs 混合在一起,我不知道它们来自哪里。

我保证每次接收 168 个字节(所以固定的字节数)。 一开始我考虑了我的结构的数据对齐,所以我介绍了<strong>attribute</strong>((<strong>packed</strong>))

labellbl_2 是字符串;我现在 JAVA 使用 UTF,但我不清楚在这种情况下如何发挥作用。

你能帮我解决这个问题吗?

非常感谢。

EO

联合我的结构 { 字符缓冲区[168]; 结构_数据{ 字符破折号[2]; 无符号长 aUnLong; 字符标签[128]; 字符 lbl_2[24]; 整数; } __attribute__((__packed__)); _data 数据; // 真实数据 };

使用这条简单的线进行阅读

我的结构对象; size_t reply_length = asio::read(s,asio::buffer(obj.buffer, 168));

这是发出的原始格式

字节 000,001:# 字节 002-010:aLong(8 字节)long - 自 1970 年 1 月 1 日以来 UTC 的毫秒数 字节 011-139:标签(128 个字节,每个字符 2 个字节)label_1 字节 140-164:lbl2(24 字节,每个字符 2 字节)label2 代码 字节 165-169:anInteger(4 字节)整数

【问题讨论】:

  • 在不知道 Java 服务器使用什么协议和/或序列化格式的情况下很难提供任何帮助。
  • 我们需要知道Java服务器发送的消息格式。

标签: c++ sockets networking boost-asio


【解决方案1】:

您的结构在常见系统上似乎不是 168 字节。如果 long 是 4 个字节(在 32 位编译中是典型的),那么如果不支持打包,则您的结构可能是 162 或 164。如果long 是 8 个字节,则为 164 或 168(如果已填充,您猜这是不好的)。

检查程序中的sizeof(_data),看看编译器告诉你它是什么。

此外,您的原始格式信息令人困惑。例如,您说“byte 002-010: aLong (8 byte) long”,但字节 2-10 是九 (9) 个字节而不是 8。是否有 crc 或校验和字节?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多