0

単純なプロトコルを使用するネットワーク経由でアプリケーションと対話しようとしています。次のようなヘッダーを送信する必要があります。

2 バイト= データ長 (リクエスト タイプを含む)
1 バイト= リクエスト タイプ

私は両方のパラメータを整数として取っています:

private static void WriteHeader(Stream buf, int length, int requestType) {
    buf.Write(BitConverter.GetBytes(length), 0, 2);
    buf.WriteByte((byte)requestType);
}

私はそれを次のように呼んでいます:

byte[] outBuf = new byte[256];
using (MemoryStream outStream = new MemoryStream(outBuf)) {
    // Socket connection stuff here
    WriteHeader(outStream, 1, 110);
    sock.Send(outBuf);
    // Receive stuff here, never returns
}

このメソッドを呼び出したり、ソケット経由で送信したりするときに例外は発生しませんoutBufが、ネットワーク アプリケーションは応答しません。ただし、他のプログラムでクエリを実行できるため、ヘッダーが正しく記述されていないことが原因であると確信しています。

値を書き込むときに何か間違っていますか?

編集: MemoryStreamコードを追加

4

5 に答える 5

2

ストリームの種類は何ですか? 入力をバッファリングしている場合、データが実際にネットワーク経由で送信されることはありません。

編集:

BitConverter.GetBytes(1) は [1, 0, 0, 0] を提供し、そこから [1,0] を渡します。エンディアンの問題かもしれません。[0,1] をヘッダーとして送信してみてください。

于 2009-08-26T05:09:42.790 に答える
1

このコードのエラーの原因として、次の 3 つが考えられます。

  • エンディアンの問題: 送信する 2 バイト長のバイト順は何ですか? GetBytes がバイトを正しい順序で与えると確信していますか?
  • パケット サイズ: メッセージのサイズが 3 バイトしかないにもかかわらず、256 バイトのデータを送信しています。
  • ペイロード: メッセージにペイロードを入れませんが、メッセージ 110 には追加のデータが必要になる場合があります。
于 2009-08-26T05:35:32.237 に答える
1

クライアントとサーバーの間にエンディアンの問題がある可能性はありますか? Wiresharkまたは同様のツールを使用してネットワーク トラフィックをキャプチャし、クライアントを使用して送受信されたパケットと、正常に通信する他のアプリケーションを比較することができます。

于 2009-08-26T05:22:50.440 に答える
1

NetworkStream を試してください:

void WriteHeader(Stream s, int len, int cmd) {
    var buf = new byte[3];
    s.Write(BitConverter.GetBytes((UInt16)len));
    s.WriteByte((byte)cmd);
}

var ns = new NetworkStream(sock);
WriteHeader(ns, 1, 110);
于 2009-08-26T05:24:05.600 に答える
0

丈を短くしたほうがいいと思います。int をストリームに書き込むとき、int は 4 バイトであり、そのうちの 2 バイトだけを buf に書き込むので、上位 2 バイトのみを取得すると思われます。

于 2009-08-26T05:10:49.947 に答える