2009-08-26 12 views
0

私は、単純なプロトコルを使用するネットワーク上のアプリケーションと対話しようとしています。2バイト整数をストリームに書き込む?

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

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を送信しても、私は例外を何も得ませんが、ネットワークアプリケーションは応答しません。私は他のプログラムでそれを照会することができますが、ヘッダーが正しく書かれていないためです。

値を書き込む際に何か問題がありますか?

EDIT:追加のMemoryStreamコード

+0

長さを '(短い)長さにキャストする ' –

答えて

2

それは、ストリームのどのようなタイプですか?あなたの入力をバッファリングする場合、実際にはデータがワイヤを介して送信されることはありません。

編集:

(1)[1、0、0、0]、そこからあなたが渡しているあなたに与え

BitConverter.GetBytes [1,0]。多分エンディアン問題です。 [0,1]をヘッダーとして送信してみてください。

+0

バイト配列を指すMemoryStreamです。 –

+0

これはそれだと思います。 WriteBytesに{0、1}を直接指定すると、受信呼び出しが返されました。今、唯一の問題は、サーバーがデータを送信していないことです。私はそれがこのコードの問題だとは思わない。 –

0

あなたの長さを短くする必要があると思われます。 intにストリームを書き込むとき、intが4バイトで、2つしかbufに書き込んでいないので、上の2バイトを取得するつもりであると思われます。

+0

残念ながら、これをshortに変更しても何もしません。私はそれが簡単だったと思う。: –

1

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

+0

現時点では、私は自分のローカルPC上でサーバアプリケーションを実行することができますが、Wiresharkはローカルホスト上のパケットをキャプチャすることができませんので、IPアドレス(この場合は127.0.0.1)ループバックアダプタでサポートされています。 –

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

私はこのコードのエラーの3源と考えることができます:

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