Java Socket.connect()到0.0.0.0:Windows与Mac
想象一下下面的代码:Java Socket.connect()到0.0.0.0:Windows与Mac,java,sockets,ip-address,connect,Java,Sockets,Ip Address,Connect,想象一下下面的代码: String hostName = "0.0.0.0"; int port = 10002; int timeout = 5000; Socket socket = new Socket(); socket.connect(new InetSocketAddress(hostName, port), timeout); 在Mac上,它工作正常并执行连接(即使在端口10002上没有运行任何东西),在Windows上,我得到以下异常: java.net.SocketExcep
String hostName = "0.0.0.0";
int port = 10002;
int timeout = 5000;
Socket socket = new Socket();
socket.connect(new InetSocketAddress(hostName, port), timeout);
在Mac上,它工作正常并执行连接(即使在端口10002上没有运行任何东西),在Windows上,我得到以下异常:
java.net.SocketException: Permission denied: connect
这里的区别是什么?Windows上的替代方案是什么?这在单元测试中使用
问候
乔纳斯(Jonas)我正在回答这个问题,以防其他人无意中发现这个问题 不幸的是,在Windows上不允许连接到任何地址 Winsock函数connect将返回错误代码WSAEADDRNOTAVAIL [远程地址不是有效地址(如INADDR\u ANY或in6addr\u ANY)], 如会议所述: 如果name参数指定的结构的address成员用零填充,connect将返回错误WSAEADDRNOTAVAIL 因此,如果不使用任何本地主机地址,我认为您尝试在Windows上执行的操作是不可能的(尽管我想知道Unix行为是错误还是故意的)
我建议设置更多的环回接口,正如马克·里德在他的文章中所建议的那样。我不知道可以连接到任何地址。你为什么不使用环回地址?@Jonas你想让0.0.0.0连接到谁?我只想让上面的行在Windows中无一例外地通过…你不能让它们无一例外地通过。您无法连接到该地址。您尝试的操作没有意义,因此是非法的。你必须连接到一个真实的IP地址。好的。。。我们必须找到解决办法,但奇怪的是,在Linux上也没有例外。区别在于winsock不允许您故意创建非法数据包。BSD套接字库不会对开发人员施加此类限制,因为他们应该知道自己在做什么。但是,如果您能够成功连接到0.0.0.0的目标地址。你正在破坏互联网。