为什么我的 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 端口,那么您将需要自己的同步机制。该协议不支持开箱即用。所以例子是:
心跳。让您的远程对等方每 5 秒发送一条特殊的多播消息。如果您在 15 秒内没有收到心跳消息,则假设远程对等方已关闭。请自行调整数字。
Ping-pong,或echo request - echo response。定期向远程对等方发送特殊数据报并期待响应。
握手、确认、重试...您需要的通道越健壮,它就越会提醒 TCP。这是一种切换协议的标志!
我的问题是我的 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 端口,那么您将需要自己的同步机制。该协议不支持开箱即用。所以例子是:
心跳。让您的远程对等方每 5 秒发送一条特殊的多播消息。如果您在 15 秒内没有收到心跳消息,则假设远程对等方已关闭。请自行调整数字。
Ping-pong,或echo request - echo response。定期向远程对等方发送特殊数据报并期待响应。
握手、确认、重试...您需要的通道越健壮,它就越会提醒 TCP。这是一种切换协议的标志!