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

它工作正常,但唯一的问题是最后一次读取总是在返回 0 之前阻塞 20 秒。我假设这是某种超时。有没有办法缩短或消除它?

4

1 回答 1

0

我无法在我的系统上重现该行为,当没有更多可用数据时,Read 立即返回 0。你确定你没有在 TcpClient 上设置任何其他属性,比如cl.NoDelay = false

您可以尝试cl.Available > 0在调用 st.Read 之前进行检查,但这并不是必须的。

您还应该处理从 Read 返回的 -1 的情况(当 TCP 流已关闭时)。否则 mem.Write 将向您抛出 ArgumentOutOfRange 异常。

于 2012-04-17T11:49:36.417 回答