java - 有没有办法在 Windows 上使用 Java 中的 DatagramSocket 忽略广播的 UDP 消息?

标签 java sockets broadcast

我正在寻找一种不接收 DatagramSocket 广播消息的方法。该实现似乎隐藏了目标地址,因此我无法将其用作过滤器。设置 setBroadcast 似乎没有任何作用。

我有一个绑定(bind)在本地 IP 地址中的套接字,但它仍然接收来自子网的所有广播消息。

InetAddress addr = InetAddress.getByName("1.2.3.4");
InetSocketAddress sockaddr = new InetSocketAddress(addr, 12345);
DatagramSocket socket = new DatagramSocket(sockaddr);

过滤广播消息并仅接收直接发送到我的 IP 的消息的最简单方法是什么?

编辑:简短的回答是否定的。这个问题源于一种体系结构,在该体系结构中,我们对 UDP 消息进行自定义路由,并且子网中的某些节点不一定进行广播或对广播感兴趣。它还存在其他问题,我们最终对架构进行了一些修改。

最佳答案

这是一个simple Java application using UDP packets该图显示了使用 DatagramPacket 类发送和接收 UDP 数据报并查询各种字段(例如发送者的 IP 地址)。因此,如果您可以使用发件人的 IP 地址作为是否应处理或忽略该消息的指示,这应该会对您有所帮助。

如果你使用的是DatagramSocket类,收到的UDP数据报包含头部信息,你可以按照这个DatagramSocket documentation解析出来。 。本文来自wikipedia on User Datagram Protocol讨论UDP数据报格式和结构。

所以问题是您是否可以拥有允许的消息发件人列表或某种方法来过滤掉不允许的发件人。

另一种选择是在数据报中提供某种标识信息或签名,使您能够识别允许的数据报和被忽略的数据报。您没有提及广播的类型,但也许您可以忽略任何小于指定字节数或类似内容的内容。或者,您可以忽略来自特定端口范围的任何数据报,或仅允许来自特定端口范围的数据报。

关于java - 有没有办法在 Windows 上使用 Java 中的 DatagramSocket 忽略广播的 UDP 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7406204/

相关文章:

c++ - Windows 中套接字发送缓冲区的大小是多少?

linux - 广播数据包不通过 Linux veth 隧道传播

java - 使用java实现Trie

Java Instant.parse on Date java 8

c# - 客户端WebSocket "The remote party closed the WebSocket connection without completing the close handshake."

java - 如何在运行时设置 java.net.preferIPv4Stack=true?

c# - 广播 ping 是如何工作的?

java - Freemarker 寻找默认模板

java - AdView 不再具有 setGravity?

php - 为什么 stream_socket_server 不阻止来自 Windows 上其他套接字的端口?