Java中的通配符绑定不会绑定到网络别名

时间:2010-11-23 11:00:18

标签: java linux binding

我遇到了一个非常不寻常的问题,只有端口的绑定功能(即通配符绑定),实际上并没有侦听Linux网络别名(单个网卡上的附加地址)。

这意味着向网卡的主IP地址发送请求可以正常工作,但对其他IP的任何请求都会失败。

过去有没有人遇到过这个?

1 个答案:

答案 0 :(得分:2)

如果我这样做:

sudo ip addr add 192.168.1.186/24 dev eth0

然后运行:

import java.net.*;

public class Bind {
    public static void main(String... args) throws Exception {
        ServerSocket ss = new ServerSocket(8888, 50, InetAddress.getByName("0.0.0.0"));
        Socket s = ss.accept();
        System.out.println("accepted socket " + s);
    }
}

然后,在另一个shell中,这个:

telnet 192.168.1.186 8888

第一个shell中的程序打印:

accepted socket Socket[addr=/192.168.1.186,port=33867,localport=8888]

如果我重复一遍,但使用我的“真实”地址,那也是有用的。

因此,我认为绑定到0.0.0.0绑定到所有地址,包括添加到设备的额外地址。

如果我改变ServerSocket构造函数调用以使用单参数形式,一切仍然按照描述的方式工作,所以它看起来像是绑定到0.0.0.0。