While patching sockopt.c, I should point out the need for the following case in the Win32 sockopt.c's apr_socket_opt_set routine:
    case APR_SO_SNDBUF:
        if (setsockopt(sock->socketdes, SOL_SOCKET, SO_SNDBUF, (void *)&on, sizeof(int)) == -1) {
            return apr_get_netos_error();
Without it one cannot set the send buffer size on Windows, which leads to a performance penalty on Windows.

Jess Holle

Justin Erenkrantz wrote:
--On Saturday, April 3, 2004 5:15 PM +0000 jerenkrantz@apache.org wrote:

jerenkrantz    2004/04/03 09:15:52

  Modified:    .        CHANGES
               network_io/unix sockopt.c
               network_io/win32 sockopt.c
  Even if we do not check the value of APR_IPV6_V6ONLY before setting, we
still   must set the option cache if we're setting APR_IPV6_V6ONLY.
Otherwise,   later apr_socket_opt_get calls will fail.

  This fixes Listen directives on IPv6 machines where IPV6_V6ONLY may be
  enabled (i.e. FreeBSD 5.x, OpenBSD, NetBSD) where it would not properly
  bind to the IPv4 socket.

This fixes an issue we saw on hermes.apache.org where the Listen directive wasn't binding to the correct interfaces.

I was pretty sure that httpd was doing the right thing here, but it was APR that lost the setting of APR_IPV6_V6ONLY - so httpd thought that IPV6_V6ONLY was disabled when it really had already been enabled.  Hence, it collapsed the IPv4 address into the IPv6 socket - causing it not to bind to IPv4.  -- justin