【问题标题】:Binding Socket to any existing address on specific subnet将套接字绑定到特定子网上的任何现有地址
【发布时间】:2016-02-25 13:46:43
【问题描述】:

我有一个 java 应用程序,我想在其中接收一个已知子网中的 udp 广播电报,例如 192.168.x.x (255.255.0.0)。如果我知道运行应用程序的机器的 IP,则以下工作(假设机器的 IP 是 192.168.10.1)

InetAddress ip = InetAddress.getByName("192.168.10.1");
DatagramSocket socket = new DatagramSocket(2222, ip);

但是如果 IP 不固定,可能来自 dhcp 服务器,我如何创建一个绑定到机器从 dhcp 服务器获取的 ip 的套接字。其他子网上可能还有其他接口,所以如果我会使用

DatagramSocket socket = new DatagramSocket(2222);

套接字不一定与 192.168.x.x 子网中的 ip 绑定。

我该如何解决这个问题?

【问题讨论】:

  • 为什么?如果您绑定到 0.0.0.0,您将从任何地方收到。这在哪些方面不符合您的目标?
  • 我想我误解了通配符,我认为绑定到 0.0.0.0 实际上会绑定到现有的 192.168.10.1,但据我所知,它会绑定到 0.0.0.0,这是任意的。这确实符合我的目标。

标签: java sockets


【解决方案1】:

因此,如果我了解您的问题是获取分配给接口的地址。我想您有多个界面,并且您想选择一个。

另请注意,使用 DatagramSocket socket = new DatagramSocket(2222); 您绑定到通配符地址,这通常意味着任何并且在许多情况下应该可以工作

从 Oracle 文档 List Network interfaces 您可以从不同的接口检索 inetAddress

import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;

public class ListNets {

    public static void main(String args[]) throws SocketException {
        Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netint : Collections.list(nets))
            displayInterfaceInformation(netint);
    }

    static void displayInterfaceInformation(NetworkInterface netint) throws SocketException {
        out.printf("Display name: %s\n", netint.getDisplayName());
        out.printf("Name: %s\n", netint.getName());
        Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
        for (InetAddress inetAddress : Collections.list(inetAddresses)) {
            out.printf("InetAddress: %s\n", inetAddress);
        }
        out.printf("\n");
     }
}  

【讨论】:

  • 假设我有两个接口,一个 192.168.10.1 和一个 10.254.10.1。如果我使用DatagramSocket socket = new DatagramSocket(2222);,我将能够通过两个接口(使用端口 2222)接收电报?
  • DatagramSocket socket = new DatagramSocket(2222); 是一个简单的解决方案。我误解了“通配符”这个词。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
相关资源
最近更新 更多