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)
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));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With