2011-06-01 67 views
1

即使服务器 确实回复,因为服务器速度不够,有时候recByte将无法​​收到响应。如果发生了,我使用如何改进这个TCP代码?

catch (System.IO.IOException ioe) 

为了防止错误,但有没有可能的替代方案,允许客户端等待一会儿? 我也尝试

clientStream.ReadTimeout = 20000; 

,但它没有工作

TcpClient Client = new TcpClient(); 
Client.Connect(ipaddress, portnum); 

NetworkStream clientStream = Client.GetStream(); 

byte[] buffer = themessagetosent; 
clientStream.Write(buffer, 0, buffer.Length); 

byte[] recByte = theresponse; 
clientStream.Read(recByte, 0, recByte.Length); 

回答

1

您需要增加tcpClient的超时时间,而不是流。另外,可能想要增加sendreceive的超时时间,并且可能要超过2秒。

var client = new TcpClient { SendTimeout = 10000, ReceiveTimeout = 10000 }; 

我相信如果你看看IOException中的内部异常,你会看到SocketException里面。查看错误代码以确定究竟发生了什么。

+0

增加ReceiveTimeOut似乎没有帮助,看起来程序不知道如何接收延迟的消息错误是System.Net.Sockets.SocketException:连接尝试失败,因为连接方在一段时间后没有正确响应,或建立的连接失败,因为连接的主机未能响应@AlexAza – Corbee 2011-06-01 02:42:39

+0

什么是SocketErrorCode的值? – 2011-06-01 02:50:02

+0

WSAETIMEDOUT 10060 @AlexAza – Corbee 2011-06-01 03:46:07

0

阅读本example on MSDN使用CanReadDataAvailable

+0

它没有达到DataAvailable,它挂在NetworkStream.Read中或跳到IOException错误@WillA – Corbee 2011-06-01 02:39:42

1

如果服务器发送的字节非常少,可以考虑在服务器端使用socket.NoDelay = false(如果需要,也可以在客户端),这将禁用Nagle算法并强制tcp/ip堆栈发送数据立即没有寻找进一步的数据收集。

当你有专用的线程来处理套接字和数据读取时,CanRead和DataAvailable被使用。

+0

不幸的是,我不是谁控制服务器@Gopalakrishnan – Corbee 2011-06-01 02:44:31

+0

socket.NoDelay = true,禁用Nagle算法 – Benny 2014-05-19 08:23:49