2012-02-27 9 views
1

C#でtcpパケットを受信しようとしていますが、いつストリームからの読み取りを停止できないのですか? は、ここで私が試したものです:ストリームが終了したことを知る方法C#

for(int i = 0; i < stm.Length; i += chunkSize) 
{ 
    bb = new byte[chunkSize]; 
    k = stm.Read(bb, 0, bb.Length); 
    ns.Write(bb, 0, k); 
} 

しかし、それは、ストリームがシーク可能でないことについて私にエラーを投げました。 だから私はこれを試してみた:

int k = chunkSize; 

while (k == chunkSize) 
{ 
    bb = new byte[chunkSize]; 
    k = stm.Read(bb, 0, bb.Length); 
    ns.Write(bb, 0, k); 
} 

が行うには何がありますか? 感謝:)

+0

Googleの "C#でTCPストリームを読み込む方法"はなぜですか?利用可能な1000 dの説明がなければなりません。 – usr

+0

私は、kをchunkSizeに等しく設定するのは問題があると信じています。 Stream.Read()が返すものを見てください。それは必ずしもあなたが期待するものと同じではありません。 – Jason

答えて

4

は、ここに私達は行く:

int read; 
while((read = stm.Read(bb, 0, bb.Length)) > 0) { 
    // process "read"-many bytes from bb 
    ns.Write(bb, 0, read); 
} 

「読み」ストリームの終わりに非正、とだけストリームの終わりになります。

単に(4.0)

以上:

stm.CopyTo(ns); 
+0

これは問題がありません。何も読んでいなければ、Readメソッドのコードがフリーズしてしまいます。タイムアウトか何かがありますが、すべてのパケットの最後にタイムアウトまで待つのは正しい解決策ではないと思います。 –

+0

@ JohnSmith次に、Select()のようなものを使用して、読み込み可能なデータがあるかどうかを判断します。 – itsme86

+0

@Johnはい、あなたはちょうど完全にReadの動作を記述しました。それを望まないのであれば、非同期APIの1つを使用し、時には非同期バージョンの非同期読み取りを心配している場合は、送信ソケット –

1

バイナリリーダーはそれを読むために正確にどのように多くのバイトを知っているので、あなたが必要となるものです!

これは、バイトの長さの前に付いているので、読み込む量を知っています!

+0

バイナリリーダーは、いくつかの非常に特殊なシナリオでのみこれを行い、プロトコルが他の場所で定義されている場合はそれほど役に立ちません。率直に言って私は多くの通信/プロトコル/シリアライゼーション/ etcコードを行い、BinaryReaderはまったく使用しません。 –

+0

haha​​ha ....私は間違っていたことを知っていた... thxxのur情報.. しかし、それは文字列を読むのに役立ちません.. – Anirudha

+0

私は "間違った"と言っていませんでした - ちょうど... over-enthusiasticおそらく。文字列を使うと、それが有用かどうかは、ワイヤプロトコルが格納されていることをどのように伝えるかによって決まります。たとえば、今週私はWebSocketフレーマーを書いてきました。 (本質的に)2つのWebSocketプロトコルがあり、両方が文字列を扱う - これは、どちらの場合でも役に立ちません。それは、redisプロトコルやprotobufプロトコルなどの文字列の助けにもならないでしょう。 –

関連する問題