如何改进这个TCP代码?

时间:2011-06-01 02:12:21

标签: c# .net sockets tcpclient

即使服务器,有时recByte也无法收到响应 确实回复,因为服务器不够快。如果发生了,我使用

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

在此example on MSDN中查看CanReadDataAvailable的使用情况。