0

我希望 Peer(s) 能够通过 WIFI LAN 发送 DatagramPackets,其唯一目的是发现其他 Peer。所以,我让每个 Peer 都由一个客户端(发送数据包)和一个服务器(监听数据包)组成。

我只能通过在每台机器上使用 IPConfig 来获取它们各自的 IPv4 地址,然后将其用作创建 DatagramPacket 的参数,才能使其工作:-

InetAddress server = InetAddress.getByName("THE IPv4 ADDRESS OF THE PEER'S SERVER
                                            RUNNING ON THE OTHER MACHINE");

DatagramPacket sendPacket = new DatagramPacket(outBuffer, outBuffer.length,
                                               server, serverPort);

我是否在这里以正确的方式使用广播(用于对等发现),因为如果我这样做对我来说似乎很垃圾?我假设我可以让 machineA 上的客户端将数据包发送到 LAN 深渊,并且在 machineB 上运行的服务器将监听整个 LAN 并检测数据包。目前我所做的只是在运行服务器的机器上手动使用 IPConfig 并在运行客户端的机器上的 DatagramPacket 中键入该地址,这似乎毫无意义。

我可以很好地使用多播,但我认为广播更适合我进行对等发现的需要。

帮助表示赞赏。

4

2 回答 2

1

这并不是真正的广播,因为您提供的是服务器的地址,而不是广播地址 ( 255.255.255.255,或者您的本地网络广播地址是什么(例如192.168.1.255,如果您的网段是192.168.1.0/24)。

您还可以考虑在您的服务器端口上设置防火墙阻止传入的 UDP 数据包。您应该查看 DatagramSocket/DatagramPacket 的文档,看看是否有正确绑定服务器套接字或正确从客户端发送数据包的魔法咒语。

[编辑:如何找到网络广播] 一旦知道网络地址,就可以找到网络广播地址,这两者都可以从您的 IP 和子网掩码中分辨出来。子网掩码基本上显示了地址中有多少是网络,有多少是客户端。(子网掩码常写成“网络掩码”) 一个例子:

IP:192.168.1.101 网络掩码:255.255.255.0 网络地址 (CIDR):192.168.1.0/24 广播地址:192.168.1.255

或者:

IP:10.13.28.55 网络掩码:255.255.0.0 网络:10.13.0.0/16 广播地址:10.13.255.255

所以本质上,网络地址末尾有一堆零,而广播地址用 1 替换它们。

IPv4 地址是 32 位数字(最容易将它们视为无符号数。如果您对地址和网络掩码进行按位与运算,则会得到网络地址。如果您将其与网络掩码的按位非运算按位或,您将获得广播地址(因此(addr & netmask) | ~netmask)将获得本地广播)。

255.255.255.255(或0xFFFFFFFF)是全球广播地址。IP 广播不跨网段,因此发送给它是安全的。

于 2012-10-23T18:22:28.067 回答
0

对服务器和客户端都使用广播地址255.255.255.255

于 2012-10-23T18:15:57.410 回答