繁体   English   中英

udpclient.receive 从未知(随机)端口

[英]Udpclient.receive from unknown (random) port

我正在使用 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,但我很确定,这是我开始使用的端点,它具有已知端口,而不是随机端口。

这是我第一次遇到这种情况,对我来说似乎很奇怪。 这些设备来自一家主要制造商,但他们肯定知道他们在做什么。

我相信我已经解决了这个问题。 诀窍是不使用 Connect,而是在 Send 命令中传递 HostEndPoint。 这种方法适用于两种设备。

Client = gcnew UdpClient();
HostEndPoint = gcnew IPEndPoint(192.168.0.20, 52381);
// Client->Connect(HostEndPoint);
Client->Send(Message, Message->Length, HostEndPoint);
Bytes = Client->Receieve(HostEndPoint);

虽然它正在工作,但我不完全确定它将允许通过哪些消息。 它可能允许来自指定 IP 的任何端口,或者它可能允许来自指定 IP 的任何响应,该响应定向到初始随机源端口。 我不确定。

另外,我最初认为我可能必须在发送和接收之间设置 HostEndPoint->Port = 0。 这有效,但没有必要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM