Xavier Roche wrote:
Hi folks,

In the Windows version of NET_BindV6() [jdk/src/windows/native/java/net/
net_util_md.c], the code seems to be doing the binding twice when using a wildcard address (see b->ipv4_fd and b->ipv6_fd)

The comment says:

(..)
* The more complicated case is when the requested address is ::0 or 0.0.0.0.
 *
 * Two further cases:
* 2. If the reqeusted port is 0 (ie. any port) then we try to bind in v4 space * first with a wild-card port argument. We then try to bind in v6 space * using the returned port number. If this fails, we repeat the process
 *    until a free port common to both spaces becomes available.
 *
* 3. If the requested port is a specific port, then we just try to get that * port in both spaces, and if it is not free in both, then the bind fails.

Why isn't the function simply switching IPV6_V6ONLY to "off" before binding ? (http://msdn.microsoft.com/en-us/library/ms738574(v=vs.85).aspx)

Such as:
    int off = 0;
    (void) setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY,
                      (char *)&off, sizeof(off));

This would allow NOT to bind two ports, and prevent any troubles with "half-bound" ports.

(Or am I missing something obvious ?)
The net-dev list would be best place to bring this. If it helps, the above is only used on older editions of Windows that don't support dual-stack sockets. You'll see on Windows Vista on newer that it uses a single socket with IPV6_V6ONLY disabled.

-Alan.

Reply via email to