質問

単純なプロトコルを使用するネットワーク上のアプリケーションと対話しようとしています。私はこのように見えるヘッダーを送らなければなりません:

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コードが追加されました

役に立ちましたか?

解決

それはどんな種類のストリームですか?入力をバッファリングすると、データが実際にワイヤー全体に送信されることはありません。

編集:

BitConverter.getBytes(1)は[1、0、0、0]を与え、そこから[1,0]を通過します。たぶんそれはエンディアンネスの問題です。 [0,1]をヘッダーとして送信してみてください。

他のヒント

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

ネットワークストリームをお試しください:

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

このコードの3つのエラーソースを考えることができます。

  • エンディアンネスの問題:送信する2バイトの長さのバイト順序は何ですか?
  • パケットサイズ:メッセージは3バイトしかサイズではありませんが、256バイトのデータを送信しています。
  • ペイロード:メッセージにペイロードを入れませんが、メッセージ110には追加のデータが必要になる場合があります。

長さを短くする必要があると思います。あなたがストリームにintをwrtieするとき、私はあなたが上位2バイトしか取得しないのではないかと疑っています。INTは4バイトであり、あなたはそれらの2つしかBUFに書いていません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top