为什么 NetworkStream.DataAvailable 总是 true?

发布于 2024-10-20 06:50:08 字数 274 浏览 2 评论 0原文

我打开一个 TcpClient,然后调用 tcpClient.GetStream().Read(message, 0, 8) 以从连接读取消息。

由于某种原因,即使连接的另一端没有发送任何数据,我仍然不断收到垃圾数据。 Read() 永远不会阻塞,DataAvailable 始终为 true,并且我得到很多垃圾数据。

可能是什么原因?

预先感谢您的帮助!

I open a TcpClient and then call tcpClient.GetStream().Read(message, 0, 8) in order to read messages from the connection.

For some reason I keep getting garbage data even though the other side of the connection does not send any data. Read() never blocks, DataAvailable is always true, and I get a lot of garbage as the data.

What could be the reason?

Thank you in advance for your help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

半衾梦 2024-10-27 06:50:08

如果不看到管道的两端(尤其是发送端),就很难回答这个问题。 DataAvailable 仅真正指示本地缓冲区的状态(而不是流本身);就确定流的结束而言,它基本上没有用(t 报告一些不相关的内容)。

预计这是传输代码中的一个错误。这里的一个典型错误如下:

var buffer = memoryStream.GetBuffer();
networkStream.Write(buffer, 0, buffer.Length);

何时:

var buffer = memoryStream.GetBuffer();
networkStream.Write(buffer, 0,
    (int)memoryStream.Length);

第一个(也是不正确的)版本发送内存流后备缓冲区的垃圾部分。

That is hard to answer without seeing both ends of the pipe (but in particular the sending end). DataAvailable only really indicates the state of the local buffer (not the stream itself); in terms of determining the end of a stream it is largely useless (t reports something unrelated).

I expect this is a bug in the transmitting code. A classic error here is the following:

var buffer = memoryStream.GetBuffer();
networkStream.Write(buffer, 0, buffer.Length);

When it should be:

var buffer = memoryStream.GetBuffer();
networkStream.Write(buffer, 0,
    (int)memoryStream.Length);

The first (and incorrect) version sends the garbage portion of the memory-stream's backing buffer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文