【问题标题】:TCP/IP detect if there is a currently connected client on a listenerTCP/IP 检测侦听器上是否有当前连接的客户端
【发布时间】:2015-11-05 20:36:03
【问题描述】:

我的 TCP/IP 侦听器有什么方法可以检测当前是否有连接的客户端?

这是我的代码:

Public Sub StopListen()
    client.Close()
    tcpClientThread.Abort()
    server.Stop()
    SyncLock accessLock
        endThread = True
    End SyncLock
    Btn_Listen.Text = "Listen"
End Sub

该代码中的问题是,每当用户按下Stop Listen 按钮并且当前没有连接到我的侦听器的cients 时,就会发生错误。

我该怎么做?

Public Sub StopListen()
   If thereIsConnectedClient Then
       client.Close()
   End If

   tcpClientThread.Abort()
   server.Stop()
   SyncLock accessLock
      endThread = True
   End SyncLock
   Btn_Listen.Text = "Listen"
End Sub

【问题讨论】:

    标签: vb.net tcpclient tcp-ip


    【解决方案1】:

    一般来说,SYNC-SYNC,ACK-ACK三路握手后,连接建立,TcpListener返回一个tcpClient。这个 tcpClient 可以保存在一个数组中。此数组中的元素数表示连接数。

    正常情况下,服务器和客户端交换数据包后,服务器或客户端都会发起FIN请求。在 FIN-ACK、FIN-ACK 标志交换后,连接完成,可以从数组中删除 tcpClient。

    现在如果有客户端没有主动关闭套接字,那么服务器可能需要一种机制来断开非活动套接字。要么通过连接超时。或者定期发送一些空包并等待来自远程客户端的 ACK 来决定客户端是否仍然存在。

    【讨论】:

    • 没有人需要在套接字上“超时”,这些是隐式设置的,无法删除,即使使用低级 API 也是如此。但是可以将超时调整为较大的值,因此它会在应用程序停止运行后很长时间有效地超时......这是一件坏事,没有人应该考虑这一点。至于“空包”:完全没用,TCP 有一个内置的 KEEPALIVE 机制,并且默认情况下启用它......如果任何一方超时或断开连接,套接字将被破坏和/或抛出异常。
    • @specializt 服务器不想让非活动的未关闭套接字永远保持活动状态。 TcpClient 具有 SendTimeout 和 ReceiveTimeout 可用于确定远程端是否无法访问。服务器如何处理连接实际上取决于如何定义数据交换协议。无论如何,如果客户端在没有正确关闭底层套接字的情况下断开自己的连接,服务端将不会意识到这一点,直到主动发送一些东西。看看这篇文章:stackoverflow.com/questions/722240/…
    • 完全错误,抱歉。只要 TCP KEEPALIVE 被激活,一旦下一批 KEEPALIVE 数据包超过阈值失败,服务器就会“通知”连接问题。如果您的特定实现禁用了 KEEPALIVE,您只能靠自己,需要手动检测这些东西……这是初学者的错误。这就是它为 .NET 完成的方式:socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);,显然。 .NET 中默认未启用 KEEPALIVE,但这并没有改变事实
    • @specializt TCP 实现对大多数应用程序级别的要求没有用处。您不能按需发送,而且对于大多数操作系统,TCP keepalive 超时只能在系统范围的级别上进行配置,并且设置得太高以至于通常对应用程序有用。
    • @specializt 在应用程序级别保持活动的原因是 TCP 标准建议将保持活动计时器设置为两个小时以上。从来没有见过没有流量的 TCP 连接这次仍然存在。因此,默认情况下 TCP 保持活动的东西是无用的。见stackoverflow.com/questions/1480236/…
    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 2012-10-29
    • 1970-01-01
    • 2022-06-30
    • 2021-01-31
    • 2016-01-24
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多