从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异常。

+0

延迟可能是由于服务器发送数据的方式。检查cl.Available不好,因为服务器可能没有完成发送数据(我尝试过并获得不完整的数据)。所以我确实需要延迟,我只是想找一种方法来缩短它。我猜20秒是在某个地方定义的。实际上我确实处理EOS,但为了简单起见,我将它放在了外面。 – 2012-04-17 12:29:38

+0

啊哈,好的。我想你已经尝试过'cl.ReceiveTimeout'? – Anlo 2012-04-17 12:36:53

+0

是的,我做到了。没有帮助。 – 2012-04-17 13:35:56