Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Socket.connect() to 0.0.0.0: Windows vs. Mac

Imagine the following code:

String hostName = "0.0.0.0";
int port = 10002;
int timeout = 5000;
Socket socket = new Socket();
socket.connect(new InetSocketAddress(hostName, port), timeout);

On the Mac it works fine and executes the connect (even with nothing running on port 10002) and on Windows I get the following exception:

java.net.SocketException: Permission denied: connect

What's the difference here and what would be the alternative on Windows? This is used in unit tests.

Regards

Jonas

like image 284
Jonas Avatar asked Aug 16 '12 07:08

Jonas


1 Answers

Just in case somebody else stumbles upon this question, I am answering it.

Unfortunately, connecting to the any address is not allowed on Windows.

The Winsock function connect will return the error code WSAEADDRNOTAVAIL [The remote address is not a valid address (such as INADDR_ANY or in6addr_any)], as stated at the Windows API Documentation:

If the address member of the structure specified by the name parameter is filled with zeros, connect will return the error WSAEADDRNOTAVAIL.

So without using any localhost address, I think what you are trying to do will not be possible on Windows (Though I wonder if the Unix behavior is a bug or intentional.).

I would suggest setting up more loopback interfaces, as Mark Reed suggested in his comment.

like image 129
ariganis Avatar answered Sep 21 '22 16:09

ariganis