2012-03-30 75 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」的別名的整數值。