Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Socket.connect()到0.0.0.0:Windows与Mac_Java_Sockets_Ip Address_Connect - Fatal编程技术网

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的目标地址。你正在破坏互联网。