我遇到了一个非常不寻常的问题,只有端口的绑定功能(即通配符绑定),实际上并没有侦听Linux网络别名(单个网卡上的附加地址)。
这意味着向网卡的主IP地址发送请求可以正常工作,但对其他IP的任何请求都会失败。
过去有没有人遇到过这个?
答案 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。