如何检查广​​播数据包是否是从本机发送的?

时间:2017-06-18 12:51:59

标签: java networking udp

我正在使用libGDX用Java编写游戏。我想在游戏中添加局域网发现,因此玩家只需按一个按钮即可开始多人游戏。为此,每个客户端将UDP个数据包广播到某个端口(255.255.255.255:40667)并侦听此端口上的其他传入数据包,以创建网络上其他播放器的列表。

这很好用,但机器广播的数据包也会被它接收。

例如:
如果网络上有2台运行程序的计算机

  

机器1(192.168.1.137)

     

机器2(192.168.1.111)

然后第一台机器接收来自192.168.1.111和来自192.168.1.137的数据包 我试图找到一种方法来确定数据包是否来自我自己的地址,但我无法弄清楚。

InetAddress.getLocalHost()返回127.0.1.1,从出站套接字读取本地地址返回0.0 0.0
如何确定数据包是否是从同一台机器发送的?

由于

1 个答案:

答案 0 :(得分:0)

您的计算机通常有多个IP地址,并且调用localhost通常会返回127.0.1.1 有几种选择如何确定本地IP地址,一种只是创建套接字连接:

// Here is the existing IP address in my local network, or you will get the exception
try (Socket socket = new Socket("192.168.0.1", 80)) {
    System.out.println(socket.getLocalAddress().getHostAddress());
} catch (UnknownHostException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

您可以通过修改地址手动指定您的主机名:

C:\Windows\System32\drivers\etc\hosts

例如,添加10.10.10.1 test并在您的应用中调用:

System.out.println(InetAddress.getByName("test").getHostAddress());
cmd中的

命令hostname将返回主机名。