How to bind a listening socket to an address?

Andreas Raab andreas.raab at gmx.de
Mon Sep 1 17:56:14 UTC 2003


> Total VM support code upheaval: 2 lines modified and 3 added.

Let's do it. Any contrary opinions?

Cheers,
  - Andreas

> -----Original Message-----
> From: squeak-dev-bounces at lists.squeakfoundation.org 
> [mailto:squeak-dev-bounces at lists.squeakfoundation.org] On 
> Behalf Of Ian Piumarta
> Sent: Monday, September 01, 2003 7:38 PM
> To: squeak-dev at lists.squeakfoundation.org
> Subject: Re: How to bind a listening socket to an address?
> 
> 
> On Mon, 1 Sep 2003, Bert Freudenberg wrote:
> 
> > Andreas Raab wrote:
> > 
> > > The listening socket is always bound to the local network 
> address (how could
> > > it be otherwise?)
> > 
> > No, a socket is always bound to a network interface (how 
> could it be 
> > otherwise?).
> 
> No, a socket can be bound to an object in the filesystem too.  (But I
> digress... ;)
> 
> Since an interface (ignoring complications from ppp etc.) 
> tends always to
> have an assigned IP host address, the two statements are near enough
> equivalent.  For a listening stream socket there is always an address
> component (the port number).
> 
> The situation with dgram sockets is a little more complex, since in
> addition to bind()ing the socket to a local i/f address (using
> listenOnPort with a backlog of 0) you can also (reversibly) 
> connect() it
> to an address -- which will cause it to send/recv only to/from the
> "connected" address.  (The VM doesn't actually do this, but it does an
> equivalent thing in sqSocketConnectToPort(), which is legal 
> for a dgram
> socket, replacing the initial peer address INADDR_ANY:0 with 
> the specified
> peer address.  The use of recvfrom() and sendto() to 
> read/write data does
> the rest.  The end effect is the same.)
> 
> > Squeak does unfortunately not support this. In the plain 
> VM, a listening 
> > socket is always bound to _all_ network interfaces. I think 
> there have 
> > been hacks to bind to specific interfaces, but I do not 
> remember where 
> > exactly I saw this.
> 
> In the VM the change needed to allow binding either a stream 
> or a dgram
> socket to an arbitrary interface address is utterly trivial 
> (and backwards
> compatible): replace the constant INADDR_ANY at line 20 of
> sqListenOnPortBacklogSize() with the address of the interface 
> to which you
> want to bind.  We'd need to pass this address in as an extra 
> parameter,
> meaning a new primitive, but this isn't so bad because the original
> primitive would become a one-liner (punting immediately to 
> the "extended"
> primitive, adding INADDR_ANY as the additional i/f address argument).
> 
> Total VM support code upheaval: 2 lines modified and 3 added.
> 
> Ciao,
> Ian
> 
> 



More information about the Squeak-dev mailing list