2012-03-30 9 views
0

Was wird in den Socket geschrieben wenn ich eine ENUM Referenz schreibe (unten)? Ich habe etwas in whireshark gefangen, aber es ähnelt nicht dem ENUM-Namen "JOIN" .. es ist auch nicht die gleiche Länge. Der Server versteht irgendwie, dass dieser Code die JOIN enum gesendet hat.Was schreibt C++ in den Socket wenn eine enum geschrieben wird

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

Ich hoffe, dass ich genug Informationen und beinhalten Aussagen enthalten ...

+3

Wenn ich eine Enum an eine Buchse schreibe, bekomme ich ein Gefühl von bevorstehendem Untergang. – Corbin

+0

Es ist das Schreiben der Byte-Darstellung von allem, was 'm_Command' in * native Endian * ist. Höchstwahrscheinlich schreibt es eine 4-Byte-Ganzzahl. Wenn Sie jedoch möchten, dass Ihr Code in verschiedenen Compilern und Architekturen stabil ist, verwenden Sie Ganzzahlen mit fester Größe und Netzwerk-Endianness (vgl. ['Htonl (3)'] (http://linux.die.net/man/3/html))). Oder noch besser: Verwenden Sie eine Serialisierungs-/Marshalling-Bibliothek wie [protobuf] (http://code.google.com/p/protobuf/). –

+0

Umso mehr Grund, meinen Ansatz zu unterstützen, den Client neu zu schreiben ... Ich kann den Server jedoch nicht ändern. Leider habe ich noch nicht den Luxus, Druckanweisungen zu kompilieren und hinzuzufügen. – jcalfee314

Antwort

0

Integraler Wert geschrieben beginnen. Die Größe der Variablen kann variieren. In Ihrem Fall kann die Größe zwischen 1 Byte Null und int Null liegen.

Um genau zu sehen, was diesen Code hinzufügen geschrieben wird:

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

Der Compiler hat eine große Flexibilität bei der Auswahl der Speichergröße und der Darstellung von Enums, solange sie sich bei der Konvertierung in ganzzahlige Typen korrekt verhalten. –

+0

Ausgänge: Größe: 4 Wert: 0 Der "Wert" wird um eins erhöht, während ich durch die Listenliste gehe. – jcalfee314

0

Wenn ich das richtig verstanden, Sie ist über das Netzwerk als String übernehmen „JOIN“ übertragen. Das ist nicht richtig. JOIN ist ein Alias ​​für einen ganzzahligen Wert (0, wenn es das erste Mitglied der Enumeration ist). Dieser ganzzahlige Wert wird über das Netzwerk übertragen, der Server weiß das; Dieser bestimmte ganzzahlige Wert ist ein Alias ​​für "JOIN". Deshalb arbeitet Ihr Server wie erwartet.
Sie können "JOIN" auch nicht als Zeichenfolge in Ihren wireshark-Protokollen sehen, sondern als Integer-Wert, der Alias ​​von "JOIN" ist.