【问题标题】:what is c++ writing to the socket when an enum gets written当枚举被写入时,c++ 向套接字写入了什么
【发布时间】:2012-04-14 13:24:42
【问题描述】:

当我写一个 ENUM 引用(如下)时,什么被写入了套接字?我在 whireshark 中捕获了一些东西,但它不像 ENUM 名称“JOIN”.. 它的长度也不相同。服务器以某种方式理解此代码发送了 JOIN 枚举。

#include <sstream>
#include <iostream>

... WriteToSocket( SOCKET hSocket, char *buf, int iCount)
  send(hSocket, buf, iCount, 0);


enum { JOIN, ...};
m_Command = JOIN;
WriteToSocket (hSocket, (char *)&m_Command, sizeof(m_Command));

我希望我包含了足够的信息并包含了陈述......

【问题讨论】:

  • 将枚举写入套接字给我一种厄运即将来临的感觉。
  • 它正在写入任何m_Commandnative endian 中的字节表示。最有可能的是,它正在写入一个 4 字节整数。但是,如果您希望您的代码在不同的编译器和体系结构中保持稳健,请使用具有网络字节序的固定大小整数(参见htonl(3))。或者更好的是,使用序列化/编组库,例如 protobuf
  • 更有理由支持我重写客户端的方法......但我无法更改服务器。不幸的是,我还没有编译和添加打印语句的奢侈。
  • 如果你不能改变服务器,你有它使用的协议的规范吗?你有读取它的源代码的权限吗?
  • 我只有客户端代码和wireshark(捕获数据包并让我看到所有内容)。应该够了...不过我正在将其转换为 Java,因此运行 C 或 C 示例将花费我更多的设置时间。

标签: c++ c iostream sstream


【解决方案1】:

开始写入一个整数值。变量的大小可以变化。在您的情况下,大小可能介于 1 字节零和 int 大小的零之间。

要准确查看正在编写的内容,请添加以下代码:

std::cout << "Size: " << sizeof(m_Command) << " Value: " << (int)m_Command << "\n";

【讨论】:

  • 编译器在选择枚举的存储大小和表示方面有很大的灵活性,只要它们在转换为整数类型时表现正确。
  • 输出:大小:4 值:0 当我在枚举列表中前进时,“值”增加一。
【解决方案2】:

如果我理解正确,您假设“JOIN”作为字符串通过网络传输。这是不正确的。 JOIN 是整数值的别名(如果它是枚举的第一个成员,则为 0)。该整数值通过网络传输,服务器知道;该特定整数值是“JOIN”的别名。这就是您的服务器按预期工作的原因。
此外,您在wireshark日志中看不到“JOIN”作为字符串,而是“JOIN”的别名的整数值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 2012-05-18
    • 2013-02-23
    • 2017-07-22
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多