将Socket绑定到特定子网上的任何现有地址

时间:2016-02-25 13:46:43

标签: java sockets

我有一个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绑定。

我怎么解决这个问题?

1 个答案:

答案 0 :(得分: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");
     }
}