我有这个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);
有人可以帮我解决问题吗?我认为这与超时有关,但如何确定?以及如何解决这个问题?
这与我如何处理这门课有关吗?
我也没有任何例外。
答案 0 :(得分:0)
这种方法似乎很好。你有多确定流可以提供你想象的那么多字节?发件人是否保证发送正确的金额?
错误是没有足够的数据。这是一个错误。超时不会修复错误,它是一种打破读取的方法,这样如果网络出现故障,应用程序就不会永久挂起(并且还会使错误不是灾难性的)。修复错误。但也要保留超时以防万一。
我也没有看到当我使用现有的C ++项目时发生的错误
这意味着错误在您的C#代码中。它不是C#的东西,读取原则上不能以任何其他方式工作。如果没有数据,您认为应该怎么做?它可以等待或失败。别无选择。
当没有数据到来时你已经调用了Read是你的错误/问题/错误。不读错。
应该引入超时;是的,但我更喜欢我得到例外,而不是永远等待
是的,如果网络出现故障(或者如果您有错误并且不想永久挂起),则在网络通信方面总是需要超时。总是有一个超时。