从stream.Read()异常中恢复

时间:2017-08-14 03:31:28

标签: c#

我有一个从服务器请求更新的功能。我提供了查询,并指出了预期的响应长度。

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异常。偶尔会发生这种情况。可能的原因是什么,以及从中恢复的最佳方法是什么?

0 个答案:

没有答案