Re: Java Socket Constructor
Andreas Leitgeb wrote:
Peter Duniho <NpOeStPeAdM@nnowslpianmk.com> wrote:
From Socket.bind():
"bind"ing is (iirc) something quite different:
you wait for incoming connections with "bind"
No, bind() simply binds a socket to an interface/port locally for both client
and server sockets. At the system call level you would then listen() to wait
for an incoming call, and finally accept() when a call arrived (if you wanted
to allow the call). In Java this is rolled into the single accept() method of
ServerSocket.
Starting an outbound connection, even if a
local address is specified will not "accept"
any new connections, so I assumed that "bind"
wasn't relevant to the concept of a source-
address. (I may be wrong here)
It is relevant. Every socket needs to be bound, either implicitly or explicitly,
to an interface/port. At the system call level a socket is a bi-directional
entity which can listen()/accept() and/or connect(). Java adds its own
abstraction layer on top of this to create Socket, with only connect(), and
ServerSocket, with only accept(). You can still bind a Socket (client) to a
local interface/port if you want to, rather than accept the default.
The whole problem was, that to specify a local
port (which may happen occasionally), there
is no Socket-constructor that wouldn't also
require a source address, but the source
address is best picked by the system, depending
on the target.
The Socket() (i.e. no arguments) constructor creates an unbound client Socket().
You can bind this with Socket.bind(SocketAddress) to bind to a specific client
port if you wish. After that you can connect() to a server. The other
constructors perform the bind() and connect() with the supplied (or default)
values.
The machine might be a router
and be known to the inner net by a different ip,
than on the other net. e.g. the outer net might
not be able to reach the machine through some
10.x.y.z address, and the inner net might not
even know the possibly dynamic IP-address of the
ppp-dialup-link. So, if that router machines
opens a connection to the inner net, then it had
better pick the 10.x.y.z address, otherwise the
externally known ip-address.
If it's a client socket then it would need to use the appropriate IP address for
the server. It wouldn't matter whether this was on the LAN or the WAN side,
using the IP of the server would be sufficient. If it was a ServerSocket being
opened then you can either use the correct IP for the interface in question to
only listen on that interface, or use the default which is to listen on all
interfaces.
--
Nigel Wade, System Administrator, Space Plasma Physics Group,
University of Leicester, Leicester, LE1 7RH, UK
E-mail : nmw@ion.le.ac.uk
Phone : +44 (0)116 2523548, Fax : +44 (0)116 2523555