【发布时间】:2021-08-12 09:49:23
【问题描述】:
我正在使用 UdpClient 发送消息并监听响应,如下所示:
Client = gcnew UdpClient();
HostEndPoint = gcnew IPEndPoint(192.168.0.20, 52381);
Client->Connect(HostEndPoint);
Client->Send(Message, Message->Length);
Bytes = Client->Receive(HostEndPoint);
我有两个相似的设备,但它们的反应不同。在第一种情况下,目的地响应与我发送到的相同端口。因此,例如,使用随机源端口 49542 发送,会发生这种情况:
Request: 192.168.1.10:49542 > 192.168.1.20:52381
Response: 192.168.1.20:52381 > 192.168.1.10:49542
通过上面的代码,我得到了预期的响应。
然而,另一个类似的设备会用一个随机端口(每次重启时都会改变)做出响应,如下所示:
Request: 192.168.1.10:49542 > 192.168.1.20:52381
Response: 192.168.1.20:46468 > 192.168.1.10:49542
在这种情况下,我没有收到响应,Receive() 将超时。我相信我明白为什么没有收到任何东西。 .net 文档中有建议,一旦您将 IPEndPoint 与 UdpClient() 或 Connect() 一起使用,任何其他响应都会被过滤掉。所以,我什至不确定为什么 Receive 有一个 IPEndPoint 参数。
我已经监控了与 WireShark 的通信,我可以看到双向的消息。所以我知道设备正在响应我只是不知道如何在我的代码中接收它。
我认为最好的解决方案是能够接收到达我的源随机端口(上面的 49542)的任何响应,另外还要指定目标 IP,但这可能不需要。或者,在任何端口上侦听来自目标 IP 的任何响应,因为我不知道如何知道设备正在响应的端口。
尽我所能,您必须为 Receive(IPEndPoint) 指明端口号,这通常是您首先发送到的消息的目标端口 - 就像在我的代码示例中一样(有效与第一个设备)。 Connect选择的随机端口无法监听,即接收端口,但我认为Receive监听来自设备的发送端口。这是未知的。
我倾向于认为,我找不到任何关于如何做到这一点的信息这一事实表明它无法做到,因为设备不应该从随机端口响应。但是,我已经与制造商讨论过这个问题,他们坚持认为这是正确的行为。
另外请注意,我尝试创建第二个 UdpClient 来侦听来自目标 IP 的响应,但它还需要定义一个端口,而且我无法知道要侦听哪个端口。我已经尝试过 UdpClient()->Client->RemoteEndPoint,但我很确定,这是我开始使用的端点,它具有已知端口,而不是随机端口。
这是我第一次遇到这种情况,我觉得很奇怪。不过,这些设备来自一家主要制造商,他们肯定知道他们在做什么。
【问题讨论】: