【问题标题】:ReadAsync stops code execution, no exception is thrown and Task is still runningReadAsync 停止代码执行,不抛出异常,Task 仍在运行
【发布时间】:2021-01-26 23:38:36
【问题描述】:

所以我使用 TcpClient 类通过我的 C# 程序连接到代理服务器。我建立连接并使用 ReadAsync 方法继续从服务器读取到缓冲区。但是当代理设备断开连接时,ReadAsync 方法似乎进入了一个循环,并且没有进一步的代码正在处理。有趣的是,没有抛出异常,Task 仍然继续工作(在 Listen() 调用中放置 await 会阻止进一步执行,即使设备断开连接也是如此)。

代码:

        public async Task Listen()
        {
            try
            {
                await server.ConnectAsync(ServerIP, ServerPort);

                if (server.Connected)
                {                    
                    using (NetworkStream stream = server.GetStream())
                    {
                        while (server.Connected)
                        {
                            try
                            {
                                byte[] buffer = new byte[server.ReceiveBufferSize];

                                int length = await stream.ReadAsync(buffer, 0, buffer.Length);
                            }
                            catch(Exception e)
                            {
                                server.Close();
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                server.Close();
            }
        }

有人知道如何检测设备何时断开连接,以便我进一步处理吗?代理服务器没有关闭,它只是停止发送数据。

【问题讨论】:

    标签: c# .net networkstream


    【解决方案1】:

    如果连接的代理端被钳制关闭 - 即关闭而没有向您的应用程序发送表明它已关闭的数据包,则可能会发生这种情况。这会将连接留在half-open state

    您需要设计您的应用程序来处理这个问题。最好的方法是让每一方定期发送一个“心跳”或“保活”数据包。如果您的代理协议支持这一点,那将是理想的。否则,您可能需要使用超时;只需设置一个计时器(每个连接一个),每次接收数据时重置它,并在计时器触发时关闭您的套接字。

    【讨论】:

    • 这肯定是我们目前的状况。我会检查代理协议是否支持它,甚至可能会与开发人员确认是否可以添加它。我想到了计时器解决方案,但想检查是否有更好的办法。
    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多