2012-03-30 76 views
0

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

#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)); 

我希望包括足够的信息,包括报表...

+3

将枚举写入套接字让我感觉到即将到来的厄运。 – Corbin 2012-03-30 20:39:14

+0

它正在编写任何'm_Command'在* native endian *中的字节表示形式。最有可能的是,它正在写一个4字节的整数。但是,如果你希望你的代码在不同的编译器和体系结构中稳健运行,可以使用具有网络字节顺序的固定大小的整数(参见['htonl(3)'](http://linux.die.net/man/3/htonl ))。或者更好的是,使用序列化/编组库,例如[protobuf](http://code.google.com/p/protobuf/)。 – 2012-03-30 20:43:32

+0

所有更多的理由支持我的方法来重新编写客户端...我不能改变服务器。不幸的是,我还没有编译和添加打印语句的奢侈。 – jcalfee314 2012-03-30 20:57:55

回答

0

的积分值是开始写的。可变参数的大小可以变化。在你的情况下,大小可能是1个字节的零之间的任何值,直到一个大小为0的零。

看到的是正在写什么,添加以下代码:

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

编译器在选择枚举的存储大小和表示时具有很大的灵活性,只要它们在转换为整型时行为正确。 – 2012-03-30 20:40:35

+0

输出:大小:4值:0 当我在枚举列表中前进时,“值”递增1。 – jcalfee314 2012-03-30 21:15:51

0

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