这个问题涉及到使用TCP消费原始数据时,NetworkStream在后台通信中发生了什么。TcpClient连接直接与网络上的硬件设备通信。不时地,在随机时间,NetworkStream似乎会出现故障,并且在调试模式下进行观察时最能描述它。我在流上设置了读取超时时间,当一切按预期工作时,当步过Stream.Read
时,它将坐在那里等待传入数据的超时时间长度。当没有这样的情况发生时,只有一小部分数据通过,TcpClient仍然显示为打开和连接状态,但是Stream.Read
不再等待传入数据的超时时间。它立即跳到下一行,显然没有接收到数据,并且在一切都被处理并重新建立新连接之前,不会有任何数据通过。
问题是,在这种特定情况下,NetworkStream处于什么状态,是什么导致了它,为什么TcpClient连接仍然处于看似打开和有效的状态?后台发生了什么?没有抛出或捕获错误,流是否在后台默默失败?TcpClient和NetworkStream状态之间有什么区别?
private TcpClient Client;
private NetworkStream Stream;
Client = new TcpClient();
var result = Client.BeginConnect(IPAddress, Port, null, null);
var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(2));
Client.EndConnect(result);
Stream = Client.GetStream();
try
{
while (Client.Connected)
{
bool flag = true;
StringBuilder sb = new StringBuilder();
while (!IsCompleteRecord(sb.ToString()) && Client.Connected)
{
string response = "";
byte[] data = new byte[512];
Stream.ReadTimeout = 60000;
try
{
int recv = Stream.Read(data, 0, data.Length);
response = Encoding.ASCII.GetString(data, 0, recv);
}
catch (Exception ex)
{
}
sb.Append(response);
}
string rec = sb.ToString();
// send off data
Stream.Flush();
}
}
catch (Exception ex)
{
}