Skip to content

Accepting on an IPv6Only listener creates a DualMode socket on Mac #47335

Description

@antonfirsov
using Socket listener = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(new IPEndPoint(IPAddress.IPv6Loopback, 0));
listener.Listen(10);

using Socket client = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
client.Bind(new IPEndPoint(IPAddress.IPv6Loopback, 0));

_ = client.ConnectAsync(listener.LocalEndPoint);

using Socket server = listener.Accept();

Console.WriteLine($"listener: {listener.DualMode} | client: {client.DualMode} | server:{server.DualMode}");

The code above will print listener: False | client: False | server:False on Linux and Windows, but listener: False | client: False | server:True on Mac.
Since we don't do anything special in our code, I assume the OS is creating an IPV6_V6ONLY == 0 accept socket despite the listener being IPV6_V6ONLY == 1.

We may want to alter the socket option in our PAL for consistency.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions