为什么我的 UDP 说它已连接但未连接?

Why is my UDP saying it is connected when it is not?

我的问题是我的 UDP 客户端报告它已连接,而我的网络上没有任何内容。我正在尝试从计算机端口 7777 连接到端口 7775 上 IP 为 10.10.10.10 的 PLC 模块。客户端的 Connect() 函数正在运行,即使没有打开以太网或无线连接。

我认为我的问题的核心围绕着我的连接代码

Public Sub Connect()
    Try
        If (plcType = 0) Then
            udpClient = New UdpClient(7777)
            udpClient.Client.Connect(IPAddress, port)
            SendCommand("ME")
        End If
    Catch
        MsgBox("Could not connect to the controller, please check IP address." & vbCrLf & Err.Description)
        'Connect()
    End Try
End Sub

如果我在 Connect() 命令后插入一个断点,我会得到非常奇怪的行为。遇到断点后,如果我查看 udpClient.Client 的属性,它说它已连接,但如果我保留这些属性然后再次查看它,它会突然改变并说它未连接,程序将正确阅读在那之后它没有连接。

此问题仅在我连接第二台计算机并尝试将其上的相同程序 运行 连接到同一设备后才出现。我可以理解,两台计算机都无法再与设备正确对话,但我不明白为什么我的一台计算机认为它正在与设备对话,而实际上它显然不是。 感谢您的帮助。

更新:任何可用的连接都会触发这种情况,只有当所有网络都被禁用或断开连接时,它才会按预期运行。但是,当该 IP 的网络上没有设备时,它仍然报告为已连接。

所以@CodeCaster 说 "UDP has no notion of being connected" 是对的。 UDP 是一种无连接的即发即弃协议。当您发送数据报时,您无法保证它一定会到达目的地。

在多种语言中可用的不同 "connect" 操作仅仅意味着 "ok, we'll use this socket for talking to this specific address and port"。此知识不会转化为通过网络发送的数据包。这是一个本地的东西,允许你使用 send 函数而不是 sendto.

如果您想知道您的网络上是否有设备在监听特定的 IP 和 UDP 端口,那么您将需要自己的同步机制。该协议不支持开箱即用。所以例子是:

  1. 心跳。让您的远程对等方每 5 秒发送一条特殊的多播消息。如果您在 15 秒内没有收到心跳消息,则假设远程对等方已关闭。请自行调整数字。

  2. Ping-pong,或echo request - echo response。定期向远程对等方发送特殊数据报并期待响应。

  3. 握手、确认、重试...您需要的通道越健壮,它就越会提醒 TCP。这是一种切换协议的标志!