从TCPClient读取时延迟
问题描述:
我有以下代码,它将未知大小的数据读入内存流。从TCPClient读取时延迟
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秒块。有什么方法可以缩短或消除它吗?
答
我无法在我的系统上重现该行为,当没有更多数据可用时,Read立即返回0。你确定你没有在TcpClient上设置任何其他属性,比如cl.NoDelay = false
?
在调用st.Read之前,您可以尝试检查cl.Available > 0
,但这应该不是必须的。
您还应该处理从Read返回的-1(TCP流关闭时)的情况。否则,mem.Write会向您发出ArgumentOutOfRange异常。
延迟可能是由于服务器发送数据的方式。检查cl.Available不好,因为服务器可能没有完成发送数据(我尝试过并获得不完整的数据)。所以我确实需要延迟,我只是想找一种方法来缩短它。我猜20秒是在某个地方定义的。实际上我确实处理EOS,但为了简单起见,我将它放在了外面。 – 2012-04-17 12:29:38
啊哈,好的。我想你已经尝试过'cl.ReceiveTimeout'? – Anlo 2012-04-17 12:36:53
是的,我做到了。没有帮助。 – 2012-04-17 13:35:56