java - 将套接字绑定(bind)到特定子网上的任何现有地址

标签 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 服务器,我如何创建一个绑定(bind)到机器从 dhcp 服务器获得的 ip 的套接字。其他子网上可能还有其他接口(interface),所以如果我将使用

DatagramSocket socket = new DatagramSocket(2222);

套接字不一定绑定(bind)到 192.168.x.x 子网中的 ip。

我该如何解决这个问题?

最佳答案

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

另请注意,通过使用 DatagramSocket socket = new DatagramSocket(2222);,您将绑定(bind)到通配符地址,这通常意味着 any 并且在许多情况下应该有效

来自 Oracle 文档 List Network interfaces您可以从不同的接口(interface)检索 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");
     }
}  

关于java - 将套接字绑定(bind)到特定子网上的任何现有地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35629096/

相关文章:

java - 使时间出现在同一位置的控制台程序

java - android.R.layout.simple_list_item_1 是什么?

C - 填充 TCP 套接字发送缓冲区

linux - 无法使用套接字将客户端连接到服务器

javascript - 降低 Node.js 套接字连接的超时时间

java - 在 Java 应用程序中跨层传递枚举

java - 检查对象的空白变量

java - 如何解决错误 : java. sql.SQLException : No suitable driver in spring security?

即使在销毁套接字后,Node.js 内存使用率仍然很高

node.js - 当远程而非本地时,Socket.io 回退到 nginx 代理后面的轮询(websocket 给出 400)