【问题标题】:ReadAllbytes method not finishing - network streamReadAllbytes 方法未完成 - 网络流
【发布时间】:2023-03-30 05:48:02
【问题描述】:

我有这个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);

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

这可能与我如何处理这个类有关吗?

我也没有遇到任何异常。

【问题讨论】:

  • 网络流大小超过长度时报错?
  • 如果长度应该相等,为什么还要添加参数length?只需使用buffer.Length
  • lengthArray 是什么?
  • @amitdayama:只是一个字节数组
  • "但是什么会导致它无限期地等待?"没有足够的字节进入。这是 Read 阻塞的唯一原因。找出为什么没有足够的字节。提供的信息无法回答问题。

标签: c# .net networking


【解决方案1】:

那个方法看起来不错。您有多确定该流可以传递您认为应有的字节数?发件人是否保证发送正确的金额?

错误是那里没有足够的数据。这是一个错误。超时并不能修复错误,它是一种中断读取的方法,以便在网络出现故障时应用程序不会永远挂起(并且错误不会造成灾难性的)。修复错误。但也要保持超时以防万一。

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

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

当没有数据到来时您调用了 Read 的事实是您的错误/问题/故障。不读取错误。

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

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

【讨论】:

  • 你说这是我的 C# 代码中的错误,但我基本上向你展示了我的 C# 代码。请看这里:stackoverflow.com/questions/33210429/…,有关我的网络课程的更多详细信息。如果你能指出那个错误,我也会接受这个答案,以及这个。
  • 该错误在这里不可见。它在别处。阅读功能正常。问题是流中剩下的数据太少。要么发送的内容不够多,要么您在其他地方阅读的内容过多。
  • 您的意思是它在我链接到的另一个问题中也不可见?这基本上是我的完整网络课程:stackoverflow.com/questions/33210429/…。也请看一下
  • 好的,我忘了看那里。该代码看起来非常好。实际上比我见过的大多数套接字代码都要好。我看不出有什么问题。可能是发件人坏了,而您的其他 C++ 客户端在接收时出现了错误。它应该阻塞/挂起,但它没有。
  • 非常感谢您的好话!实际上,现在我在 C# 端添加了超时,它的工作更加稳定,不再挂起,你觉得呢??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 2020-12-30
  • 2021-03-22
  • 2020-06-28
  • 1970-01-01
  • 2012-12-04
相关资源
最近更新 更多