如何使用NetworkStream.DataAvailable属性检测TCP连接失败?

问题描述 投票:0回答:1

当使用 Socket 对于TCP来说,当连接丢失时,试图读取数据会抛出一个异常。我习惯于在TCP操作失败时使用异常来意识到,因为除了尝试读写,你无法可靠地判断一个连接已经中断。

但我刚刚注意到 NetworkStream.DataAvailable 只需返回 false 在这种情况下,和 TcpClient.GetStream 也成功返回。我有如下代码(用于投票循环)--是否有办法扩展这种方法来检测失败的连接?

    public int Read()
    {
        var stream = tcp.GetStream();
        if (!stream.DataAvailable)
            return 0;
        else
            return stream.Read(InBuffer, 0, InBuffer.Length);
    }

如果没有,那么我将不得不调用其中一个叫做 Read 方法使用超时--这让我不禁要问,使用 DataAvailable 因为这很容易导致检测不到失败连接的错误。

c# .net tcplistener
1个回答
1
投票

不,不可以。

看,当连接中断时,你会得到一个异常。

DataAvailable可能只是在当下没有数据可用。数据包的传输需要时间,数据包可能会丢失。TCP有一个重新发送列表数据包的机制,但会造成延迟。

GetStream返回流。这是你的端点。当连接可用时,它就会返回,这是有道理的。DataAvailable 是用来检查是否有数据等待。没有等待的数据并不是丢失的连接,而是没有等待的数据。

© www.soinside.com 2019 - 2024. All rights reserved.