Hi Sven,


On Sat, Jun 14, 2014 at 4:09 AM, Sven Van Caekenberghe <sven@stfx.eu> wrote:

On 14 Jun 2014, at 12:18, Ben Coman <btc@openInWorld.com> wrote:

> Sven Van Caekenberghe wrote:
>> In any case, the server socket used is normally listening on all interfaces [0.0.0.0]
>>
>> Sven
>>
>>
>
> Maybe it matters that [0.0.0.0] is the IPv4-Unspecified-Address
> and it might make a difference to use IPv6-Unspecified-Address [0:0:0:0:0:0:0:0] or [::]
>
> cheers -ben

I guess it all depends on the Socket plugin. ZnServer has #bindingAddress: which eventually calls Socket>>#listenOn:backlogSize:interface: but the question is, what is acceptable as last argument. And how is the difference between v4 and v6 handled. There is a 'primitives-ipv6' category, but no #listenOn with an interface there.

I wonder whether this commit is relevant:

r2552 | eliot | 2012-05-02 16:13:02 -0700 (Wed, 02 May 2012) | 19 lines

CogVM source as per VMMakerr.oscog-eem.159
...

Fix limitation in platforms/unix/plugins/SocketPlugin/sqUnixSocket.c which could
cause NetNameResolver localHostAddress to answer 0 (if host has a set hostname
not being honoured by local DNS servers). ��Fix falls back to localhost.
...

Here's the relevant part of the platforms/unix/plugins/SocketPlugin/sqUnixSocket.c change:

-sqInt sqResolverLocalAddress(void) �� �� �� �� �� �� { return nameToAddr(localHostName); }
+sqInt sqResolverLocalAddress(void)
+{ �� �� ��sqInt localaddr = nameToAddr(localHostName);
+ �� �� �� if (!localaddr)
+ �� �� �� �� �� �� �� localaddr = nameToAddr("localhost");
+ �� �� �� return localaddr;
+}

This fixed several socket tests on my Mac OS box. ��I think it affects systems behind a broadband router, at least that's how it asffected me on my laptop at home. ��And here's what is probably the root cause in platforms/unix/plugins/SocketPlugin/sqUnixSocket.c:

...
static char �� localHostName[MAXHOSTNAMELEN];
static u_long localHostAddress; /* GROSS IPv4 ASSUMPTION! */
...
/* start a new network session */

sqInt sqNetworkInit(sqInt resolverSemaIndex)
{
�� if (0 != thisNetSession)
�� �� return 0; ��/* already initialised */
�� gethostname(localHostName, MAXHOSTNAMELEN);
�� localHostAddress= nameToAddr(localHostName);
�� thisNetSession= clock() + time(0);
�� if (0 == thisNetSession)
�� �� thisNetSession= 1; ��/* 0 => uninitialised */
�� resolverSema= resolverSemaIndex;
�� return 0;
}
...
and so if gethostname answers something weird, attempts to access localHost are screwed from initialization on.

HTH
--
best,
Eliot