2012-03-30 13 views
0

ENUMリファレンス(下記)を書くときに何がソケットに書き込まれますか?私はwhiresharkに取り込まれた何かを持っていますが、ENUMの名前 "JOIN"に似ていません。同じ長さでもありません。サーバーは何とかこのコードがJOIN列挙を送信したことを理解しています。enumが書き込まれたときにソケットに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

+0

これは 'm_Command'が* native endian *にあるもののバイト表現を書いています。おそらく、それは4バイト整数を書いています。しかし、異なるコンパイラやアーキテクチャ間でコードを堅固にしたい場合は、ネットワークエンディアンで固定長の整数を使用してください(['htonl(3)'](http://linux.die.net/man/3/htonl ))。または、より良い方法では、[protobuf](http://code.google.com/p/protobuf/)などのシリアライズ/マーシャリングライブラリを使用します。 –

+0

私のアプローチをサポートしてクライアントを書き直す理由がもっと...私はサーバーを変更することはできません。残念ながら、私はまだ印刷文のコンパイルと追加の贅沢はありません。 – jcalfee314

答えて

0

...私は十分な情報が含まれて希望と文が含まれています。 varaibleのサイズはさまざまです。あなたのケースでは、サイズは1バイトのゼロから最大でintまでです。 、書き込まれている正確に何を見、このコードを追加するには

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

コンパイラは、整数型に変換したときに正しく動作する限り、ストレージサイズと列挙型の選択に柔軟性があります。 –

+0

出力:サイズ:4値:0 "値"は、列挙型リストを進めるにつれて1ずつ増加します。 – jcalfee314

0

私が正しく理解している場合は、文字列としてネットワーク上で転送される「結合」を前提としています。これは正しくありません。 JOINは整数値のエイリアスです(列挙の最初のメンバーの場合は0)。その整数値はネットワークを介して転送され、サーバはそれを知っています。その特定の整数値は "JOIN"の別名です。それはあなたのサーバーが期待どおりに動作する理由です。
また、wiresharkログの文字列として "JOIN"が表示されるのではなく、 "JOIN"のエイリアスである整数値が表示されます。

関連する問題