ストリームに2バイトの整数を書きますか?
-
19-09-2019 - |
質問
単純なプロトコルを使用するネットワーク上のアプリケーションと対話しようとしています。私はこのように見えるヘッダーを送らなければなりません:
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に書いていません。