C# 如何改进此TCP代码?

C# 如何改进此TCP代码?,c#,.net,sockets,tcpclient,C#,.net,Sockets,Tcpclient,有时,即使服务器 没有回复,因为服务器速度不够快。如果发生这种情况,我会使用 catch (System.IO.IOException ioe) 为了防止错误,是否有可能的替代方案允许客户端等待更长的时间? 我确实试过了 clientStream.ReadTimeout = 20000; 但它不起作用 TcpClient Client = new TcpClient(); Client.Connect(ipaddress, portnum); NetworkStream clientStr

有时,即使服务器 没有回复,因为服务器速度不够快。如果发生这种情况,我会使用

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

请在此查看
CanRead
DataAvailable
的用法。

您需要增加tcpClient的超时时间,而不是流的超时时间。另外,可能希望将
发送
接收
的超时时间都增加,并且可能要超过2秒

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

我相信,如果您查看IOException中的内部异常,您将看到内部的SocketException。查看错误代码以了解到底发生了什么。

< P>如果服务器发送的字节数非常少,可以考虑在服务器端使用SoCKET.NoTrime= false(如果需要的话也在客户端),这就禁用了Nagle算法,并迫使TCP/IP栈立即发送数据,而不需要寻找进一步的数据收集。
当您有专门的线程来处理套接字和数据读取时,CanRead和DataAvailable可以很好地使用。

它不允许DataAvailable,而是挂起在网络流中。read或跳过IOException错误@Willain增加ReceiveTimeOut似乎没有帮助,程序似乎不知道如何接收延迟消息错误为System.Net.Sockets.SocketException:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机未能响应@alexaza,
SocketErrorCode
的值是多少?我假设这发生在
clientStream.Read
,这意味着您需要等待更长的时间,或者服务器根本没有响应。您的权利,服务器不久前似乎没有正确响应,谢谢@Alexazar不幸的是,我不是控制服务器的人@Gopalakrishnansocket.NoDelay=true,禁用Nagle算法