2010-11-23 36 views
0

我遇到了一个很常见的问题,其中仅用于端口的绑定函数(即通配符绑定)实际上并不监听Linux网络别名(单个网卡上的附加地址) 。Java中的通配符绑定不绑定到网络别名

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

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

+0

这些'别名'是如何设置的? `ip addr add`,还是别的? – 2010-11-23 16:50:47

+0

他们通过ifcfg-eth0:0等添加。 – SyBer 2010-11-25 20:02:13

回答

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 

在第一壳体打印程序:

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

如果我再说一遍,但使用我的'真实'地址,那也可以。

因此,它看起来像绑定到0.0.0.0绑定到所有地址,包括额外的添加到设备。

如果我更改ServerSocket构造函数调用以使用单参数形式,所有东西仍然如上所述,所以它看起来像是绑定到0.0.0.0。