ReadAllbytes方法未完成 - 网络流

时间:2015-10-19 11:11:58

标签: c# .net networking

我有这个ReadAllBytes方法应该读取一定数量 来自NetworkStream

的字节数
private void ReadAllBytes(byte[] buffer, int length)
{
    if (buffer.Length != length)
        throw new Exception("WriteBytes: Length should be same");

    Stream stm = m_client.GetStream();

    // Start reading
    int offset = 0;
    int remaining = length;
    while (remaining > 0)
    {
        int read = stm.Read(buffer, offset, remaining);
        if (read <= 0)
            throw new EndOfStreamException
                (String.Format("ReadAllBytes: End of stream reached with {0} bytes left to read", remaining));
        remaining -= read;
        offset += read;
    }
}

事情是它大部分时间都有效,但有时当程序进入此功能时,它永远不会返回并且似乎永远运行。我发现这是使用日志记录。我用它像:

public TcpClient m_client = new TcpClient();
m_client.Connect(IP,port);
ReadAllBytes(lengthArray, 2);

有人可以帮我解决问题吗?我认为这与超时有关,但如何确定?以及如何解决这个问题?

这与我如何处理这门课有关吗?

我也没有任何例外。

1 个答案:

答案 0 :(得分:0)

这种方法似乎很好。你有多确定流可以提供你想象的那么多字节?发件人是否保证发送正确的金额?

错误是没有足够的数据。这是一个错误。超时不会修复错误,它是一种打破读取的方法,这样如果网络出现故障,应用程序就不会永久挂起(并且还会使错误不是灾难性的)。修复错误。但也要保留超时以防万一。

  

我也没有看到当我使用现有的C ++项目时发生的错误

这意味着错误在您的C#代码中。它不是C#的东西,读取原则上不能以任何其他方式工作。如果没有数据,您认为应该怎么做?它可以等待或失败。别无选择。

当没有数据到来时你已经调用了Read是你的错误/问题/错误。不读错。

  

应该引入超时;是的,但我更喜欢我得到例外,而不是永远等待

是的,如果网络出现故障(或者如果您有错误并且不想永久挂起),则在网络通信方面总是需要超时。总是有一个超时。