我有一个从服务器请求更新的功能。我提供了查询,并指出了预期的响应长度。
public Byte[] GetUpdate(Byte[] query, int expLength)
{
var response = new Byte[expLength];
lock(Client)
{
Stream s = Client.GetStream();
s.Write(query, 0, query.Length);
var totalBytesRead = 0;
var numAttempts = 0;
while(totalBytesRead < expLength && numAttempts < MAX_RETRIES)
{
numAttempts++;
int bytes;
try
{
bytes = s.Read(response, totalBytesRead, expLength);
}
catch (Exception ex)
{
throw new IOException();
}
totalBytesRead += bytes;
}
if(totalBytesRead < expLength)
{
// should probably throw something here
throw new IOException();
}
}
return response;
}
下面给出调用上述函数的函数。它们都属于class Connection
。
public Byte[] GetData(string ip, int port ,Byte [] query, int responseLen)
{
Connection connection = GetConnection(ip,port);
Byte[] data = null;
try
{
data = connection.GetUpdate(query, responseLen);
}
catch(Exception e)
{
connection?.Disconnect();
return new Byte[0];
}
return data;
}
我的问题如下。
使用上面的代码,我试图读取远程网络端点的一些值。有时,链接上的连接会断开。我通过手动拔出以太网电缆来测试场景。一旦我拔下并插上电缆,我有时会发现函数s.Read()
中的GetUpdate
会引发StreamReadFailed
异常。偶尔会发生这种情况。可能的原因是什么,以及从中恢复的最佳方法是什么?