我有以下代码,它将未知大小的数据读入内存流。
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秒。 我假设这是某种超时。有没有办法缩短或消除它?
答案 0 :(得分:0)
我无法在我的系统上重现该行为,当没有更多可用数据时,Read立即返回0。您确定没有在TcpClient上设置任何其他属性,例如cl.NoDelay = false
?
您可以在调用st.Read之前尝试检查cl.Available > 0
,但这不应该是必要的。
您还应该处理从Read返回的-1的情况(当TCP流已关闭时)。否则mem.Write会抛出一个ArgumentOutOfRange异常。