Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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)
like image 341
user2041602 Avatar asked Feb 05 '13 02:02

user2041602


Video Answer


1 Answers

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));
like image 68
antak Avatar answered Sep 23 '22 06:09

antak