2011-08-01 16 views
0

私はネットワーキングには新しく、うまくいけば私の問題を説明することができます。javaクライアントとTCP接続を介してC++サーバとの通信

私の上司は、最近私のアプリケーションのネットワーキングをテストするために私のためのダミーサーバーを作って、私はJavaからC++への問題に遭遇しました。彼のサーバはC++で書かれていますし、実行、それが特定のC++のデータを待って、聞くときには、渡される「RemoteMsgStruct」という名前のstruct:

typedef struct 
{ 
unsigned int Length; 
unsigned int BoardType; 
unsigned int MsgType; 
unsigned char Msg[MAX_MSG_SIZE]; 
} RemoteMsgStruct; 

問題私のプログラムはJavaで書かれているという事実にあります。どのように処理するサーバーのためのjavaを介して同様のメッセージを渡すつもりですか?

ご協力いただきありがとうございます。何かが十分に説明されていないか、見逃しているように見える場合は、私に知らせてください。私が言ったように、私はネットワークとstackoverflowの両方に新しいです:)

+0

にCを検討していますソケットによって処理される。アプリケーションでデータをエンコードする方法も、サーバー側でデコードする必要があります。最初にプロトコルを決めて、どんなエンコーディングデコーディング手法でも先に進んでください。例えば、生のバイトフォーマット/ XML/JSON /プロトコルバッファーなど – Arunmu

+0

@Juan EBOSSHASNOCLUE – Alnitak

答えて

0

ようこそ。

あなたの質問には、XMLやJSONなどのメッセージングフォーマットが非常に人気があり、このような問題を解決する理由があります。それは、署名されていないintを送信し、文字のエンコーディングとエンディアンを心配する必要があります。サーバー側でフォーマットを変更できない場合は、ByteBufferをご覧ください。あなたはまだマッサージをしなくてはなりませんが、少なくとも痛みのいくつかを軽減します。

1

ボスのテストプログラムが期待するデータを、上司に変更することなく正確に渡すことができます。 Java側で

、あなたはを含むいくつかの方法を経由してC++の構造体で定義されたレイアウトにデータを書き込むことができます。 * java.io.DataOutputStreamのメソッド * java.nio.ByteBufferのとjava.nio.channels.SocketChannel。

フィールドの整列とバイトオーダーの問題が発生することがあります。 * C構造体の一部のフィールドは、ワード境界に合わせるためにパディング後に開始することがあります。 * Javaはデフォルトでネットワークバイトオーダー(ビッグエンディアン)を書き込みます。 Java側では、ByteBufferは異なる順序を選択できます。

0

アンディの答えは正しいです。しかし、上司のプログラムを書き直す必要があると言わざるを得ない。

  1. ハードウェアのバイト順
  2. コンパイラの:直接ネットワーク上のCの構造体を渡すと、もう一方の端は、技術には、次の両端で同じであることに依存しているC言語で書かれている場合でも、良いアイデアになることはありません充填包装ルール
  3. 周囲の#pragma

したがって

  1. コンパイルR・ベンダー
  2. コンパイラのバージョン

この(不完全)リストには、すでにあまりにも長いです、そして我々はまだ唯一のあなたはTCPソケットからのデータがどのように見ている必要があるC.

+0

私たちが持っている情報が限られているため、「書き直す必要があります。 #1はntohlなどでアドレス指定できることに注意してください。複数のコンパイラが必要な場合は#2 /#3が重要です。 –

+0

@Andy Thomas-Cramer私は同意しない。私はそれが十分に強いとは思わない*この種のことは可能な限り強力に廃止されることになっている。ワイヤプロトコルはホスト言語とは独立して定義する必要があり、このスレッドは十分な証拠です。 – EJP

関連する問題