Copyright 2009 The Go Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris windows
package net
import (
)
Probe probes IPv4, IPv6 and IPv4-mapped IPv6 communication capabilities which are controlled by the IPV6_V6ONLY socket option and kernel configuration. Should we try to use the IPv4 socket interface if we're only dealing with IPv4 sockets? As long as the host system understands IPv4-mapped IPv6, it's okay to pass IPv4-mapeed IPv6 addresses to the IPv6 interface. That simplifies our code and is most general. Unfortunately, we need to run on kernels built without IPv6 support too. So probe the kernel to figure it out.
favoriteAddrFamily returns the appropriate address family for the given network, laddr, raddr and mode. If mode indicates "listen" and laddr is a wildcard, we assume that the user wants to make a passive-open connection with a wildcard address family, both AF_INET and AF_INET6, and a wildcard address like the following: - A listen for a wildcard communication domain, "tcp" or "udp", with a wildcard address: If the platform supports both IPv6 and IPv4-mapped IPv6 communication capabilities, or does not support IPv4, we use a dual stack, AF_INET6 and IPV6_V6ONLY=0, wildcard address listen. The dual stack wildcard address listen may fall back to an IPv6-only, AF_INET6 and IPV6_V6ONLY=1, wildcard address listen. Otherwise we prefer an IPv4-only, AF_INET, wildcard address listen. - A listen for a wildcard communication domain, "tcp" or "udp", with an IPv4 wildcard address: same as above. - A listen for a wildcard communication domain, "tcp" or "udp", with an IPv6 wildcard address: same as above. - A listen for an IPv4 communication domain, "tcp4" or "udp4", with an IPv4 wildcard address: We use an IPv4-only, AF_INET, wildcard address listen. - A listen for an IPv6 communication domain, "tcp6" or "udp6", with an IPv6 wildcard address: We use an IPv6-only, AF_INET6 and IPV6_V6ONLY=1, wildcard address listen. Otherwise guess: If the addresses are IPv4 then returns AF_INET, or else returns AF_INET6. It also returns a boolean value what designates IPV6_V6ONLY option. Note that the latest DragonFly BSD and OpenBSD kernels allow neither "net.inet6.ip6.v6only=1" change nor IPPROTO_IPV6 level IPV6_V6ONLY socket option setting.
In general, an IP wildcard address, which is either "0.0.0.0" or "::", means the entire IP addressing space. For some historical reason, it is used to specify "any available address" on some operations of IP node. When the IP node supports IPv4-mapped IPv6 address, we allow a listener to listen to the wildcard address of both IP addressing spaces by specifying IPv6 wildcard address.
The pages are generated with Goldsv0.3.2-preview. (GOOS=darwin GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds.