1

次のコードは、サイズが不明なデータをメモリ ストリームに読み込みます。

Dim cl As New Net.Sockets.TcpClient()
cl.Connect(host, port)
Dim st As IO.Stream = cl.GetStream()
Dim bytes(50000) As Byte
Dim mem As New IO.MemoryStream()
Dim len As Integer = 0
Do
  len = st.Read(bytes, 0, 50000)
  mem.Write(bytes, 0, len)
Loop While len > 0
mem.Close()

正常に動作しますが、唯一の問題は、最後の読み取りが常に 20 秒間ブロックされてから 0 が返されることです。これは何らかのタイムアウトであると想定しています。それを短縮または排除する方法はありますか?

4

1 に答える 1

0

私のシステムではその動作を再現できません。使用可能なデータがなくなると、Read は即座に 0 を返します。のように、TcpClient に他のプロパティを設定していませんcl.NoDelay = falseか?

cl.Available > 0st.Read を呼び出す前に確認することもできますが、実際には必要ありません。

Read から返された -1 のケースも処理する必要があります (TCP ストリームが閉じられている場合)。そうしないと、mem.Write は ArgumentOutOfRange 例外をスローします。

于 2012-04-17T11:49:36.417 に答える