user2041602
user2041602

Reputation: 179

Java Socket, binding to local port

I am trying to bind the Socket on the client side to any particular local port, in this code I used 20000.

Normal connections such as below works just fine. But does not allow for me to choose the local port.

hostSocket = new Socket(host,80);

So I tried this:

hostSocket = new Socket(host, 80, InetAddress.getLocalHost(), 20000);

and this:

hostSocket = new Socket();
hostSocket.bind(new InetSocketAddress("localhost", 20000));
hostSocket.connect(new InetSocketAddress(host,80));

But they both leave me with this exception... in the second case the exception occurred on the connect call. I'm not really sure what I am missing and I would love some pointers.

java.net.SocketException: Invalid argument or cannot assign requested address
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
at java.net.Socket.connect(Socket.java:546)
at java.net.Socket.connect(Socket.java:495)
at com.mb.proxy.netflix.NetflixPrefetchingAgent.connect(NetflixPrefetchingAgent.java:98)
at com.mb.proxy.netflix.NetflixPrefetchingAgent.run(NetflixPrefetchingAgent.java:164)
at java.lang.Thread.run(Thread.java:679)
Exception in thread "Thread-19" java.lang.NullPointerException
at com.mb.proxy.netflix.NetflixPrefetchingAgent.prefetchChunk(NetflixPrefetchingAgent.java:272)
at com.mb.proxy.netflix.NetflixPrefetchingAgent.run(NetflixPrefetchingAgent.java:176)
at java.lang.Thread.run(Thread.java:679)

Upvotes: 10

Views: 31807

Answers (2)

antak
antak

Reputation: 20869

Brian's answer is spot on in identifying the issue.

However, you don't need the IP address of the outbound interface because you can simply specify 0.0.0.0 for "any address". The correct outbound interface will then be chosen automatically. This is much like when you connect without binding first.

Moreover, the easiest way to specify 0.0.0.0 as the address is to omit the parameter.

Therefore:

hostSocket = new Socket();
hostSocket.bind(new InetSocketAddress(20000));
hostSocket.connect(new InetSocketAddress(host, 80));

Upvotes: 4

Brian Roach
Brian Roach

Reputation: 76918

You have to bind to the external (outbound) IP address of your machine, not localhost (127.0.0.1).

The following works on my box without issue:

Socket s = new Socket();
s.bind(new InetSocketAddress("172.16.1.102", 5000));
s.connect(new InetSocketAddress("google.com", 80));

Where 172.16.1.102 is the NAT'd private network address assigned to this box via DHCP from my router.

Upvotes: 36

Related Questions