【问题标题】:Determine broken connection in TCP server确定 TCP 服务器中的断开连接
【发布时间】:2016-09-25 22:45:13
【问题描述】:

我写了一个tcp服务器,每次客户端连接接受,AcceptEndAccept返回的socket实例被称为handler以及许多其他信息收集在对象TcpClientConnection中,我需要确定是否一个连接是否在某个特定的间隔时间连接,Socket.Connected 属性不可靠,根据文档,我应该使用带有SelectRead 选项的Poll 方法来执行此操作。 在一个测试场景中,我拔下客户端电缆,等待基于handler.Poll(1, SelectMode.SelectRead) 的损坏警报,它应该返回 true,但从未发生过。

【问题讨论】:

  • 你能提供一些代码吗?

标签: c# tcpserver


【解决方案1】:

这从根本上是由 TCP 和 IP 协议的工作方式引起的。检测连接是否断开的唯一方法是通过连接发送一些数据。底层 TCP 协议将导致从接收方将确认发送回发送方,从而允许检测到断开的连接。

这些文章提供了更多信息

Do I need to heartbeat to keep a TCP connection open?

http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

【讨论】:

  • 感谢您的链接
【解决方案2】:

根据 Socket.Poll 的文档:

此方法无法检测某些类型的连接问题,例如网络电缆损坏或远程主机被不正常关闭。您必须尝试发送或接收数据以检测此类错误。

换句话说 - 轮询对于检查某些数据是否到达以及是否可用于您的本地操作系统网络堆栈很有用。 如果您需要检测连接问题,您需要调用阻塞读取(例如Socket.Receive

您还可以构建一个简单的初始化迷你协议来来回交换一些约定的“你好”消息。 这是一个简化的示例:

    private bool VerifyConnection(Socket socket)
    {
        byte[] b = new byte[1];
        try
        {
            if (socket.Receive(b, 0, 1, SocketFlags.None) == 0)
                throw new SocketException(System.Convert.ToInt32(SocketError.ConnectionReset));
            socket.NoDelay = true;
            socket.Send(new byte[1] { SocketHelper.HelloByte });
            socket.NoDelay = false;
        }
        catch (Exception e)
        {
            this._logger.LogException(LogLevel.Fatal, e, "Attempt to connect (from: [{0}]), but encountered error during reading initialization message", socket.RemoteEndPoint);
            socket.TryCloseSocket(this._logger);
            return false;
        }


        if (b[0] != SocketHelper.HelloByte)
        {
            this._logger.Log(LogLevel.Fatal,
                "Attempt to connect (from: [{0}]), but incorrect initialization byte sent: [{1}], Ignoring the attempt",
                socket.RemoteEndPoint, b[0]);
            socket.TryCloseSocket(this._logger);
            return false;
        }

        return true;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多