X7ROOT File Manager
Current Path:
/opt/golang/1.22.0/src/net
opt
/
golang
/
1.22.0
/
src
/
net
/
📁
..
📄
addrselect.go
(9.69 KB)
📄
addrselect_test.go
(8.5 KB)
📄
cgo_aix.go
(582 B)
📄
cgo_android.go
(272 B)
📄
cgo_bsd.go
(343 B)
📄
cgo_darwin.go
(298 B)
📄
cgo_linux.go
(642 B)
📄
cgo_netbsd.go
(276 B)
📄
cgo_openbsd.go
(276 B)
📄
cgo_resnew.go
(580 B)
📄
cgo_resold.go
(579 B)
📄
cgo_socknew.go
(753 B)
📄
cgo_sockold.go
(842 B)
📄
cgo_solaris.go
(343 B)
📄
cgo_stub.go
(1.33 KB)
📄
cgo_unix.go
(11.35 KB)
📄
cgo_unix_cgo.go
(2.24 KB)
📄
cgo_unix_cgo_darwin.go
(461 B)
📄
cgo_unix_cgo_res.go
(911 B)
📄
cgo_unix_cgo_resn.go
(998 B)
📄
cgo_unix_syscall.go
(2.99 KB)
📄
cgo_unix_test.go
(1.44 KB)
📄
conf.go
(15.63 KB)
📄
conf_test.go
(12.28 KB)
📄
conn_test.go
(1.82 KB)
📄
dial.go
(25.68 KB)
📄
dial_test.go
(30.14 KB)
📄
dial_unix_test.go
(2.77 KB)
📄
dnsclient.go
(5.65 KB)
📄
dnsclient_test.go
(1.51 KB)
📄
dnsclient_unix.go
(24.26 KB)
📄
dnsclient_unix_test.go
(69.13 KB)
📄
dnsconfig.go
(1.73 KB)
📄
dnsconfig_unix.go
(4.16 KB)
📄
dnsconfig_unix_test.go
(7.07 KB)
📄
dnsconfig_windows.go
(1.6 KB)
📄
dnsname_test.go
(1.96 KB)
📄
error_plan9.go
(224 B)
📄
error_plan9_test.go
(437 B)
📄
error_posix.go
(543 B)
📄
error_posix_test.go
(981 B)
📄
error_test.go
(20.32 KB)
📄
error_unix.go
(382 B)
📄
error_unix_test.go
(723 B)
📄
error_windows.go
(355 B)
📄
error_windows_test.go
(757 B)
📄
example_test.go
(8.45 KB)
📄
external_test.go
(4.05 KB)
📄
fd_fake.go
(3.79 KB)
📄
fd_js.go
(627 B)
📄
fd_plan9.go
(3.56 KB)
📄
fd_posix.go
(4.29 KB)
📄
fd_unix.go
(5.43 KB)
📄
fd_wasip1.go
(496 B)
📄
fd_windows.go
(6.14 KB)
📄
file.go
(1.69 KB)
📄
file_plan9.go
(2.72 KB)
📄
file_stub.go
(481 B)
📄
file_test.go
(6.43 KB)
📄
file_unix.go
(2.5 KB)
📄
file_unix_test.go
(2.07 KB)
📄
file_wasip1.go
(2.2 KB)
📄
file_wasip1_test.go
(3.76 KB)
📄
file_windows.go
(521 B)
📄
hook.go
(894 B)
📄
hook_plan9.go
(211 B)
📄
hook_unix.go
(658 B)
📄
hook_windows.go
(720 B)
📄
hosts.go
(3.48 KB)
📄
hosts_test.go
(5.6 KB)
📁
http
📄
interface.go
(7.26 KB)
📄
interface_aix.go
(4.46 KB)
📄
interface_bsd.go
(2.82 KB)
📄
interface_bsd_test.go
(1.44 KB)
📄
interface_bsdvar.go
(718 B)
📄
interface_darwin.go
(1.29 KB)
📄
interface_freebsd.go
(1.29 KB)
📄
interface_linux.go
(6.96 KB)
📄
interface_linux_test.go
(3.65 KB)
📄
interface_plan9.go
(4.71 KB)
📄
interface_solaris.go
(2.13 KB)
📄
interface_stub.go
(814 B)
📄
interface_test.go
(9.76 KB)
📄
interface_unix_test.go
(4.85 KB)
📄
interface_windows.go
(5.43 KB)
📁
internal
📄
ip.go
(13.88 KB)
📄
ip_test.go
(25.6 KB)
📄
iprawsock.go
(7.11 KB)
📄
iprawsock_plan9.go
(874 B)
📄
iprawsock_posix.go
(3.89 KB)
📄
iprawsock_test.go
(5.98 KB)
📄
ipsock.go
(9.05 KB)
📄
ipsock_plan9.go
(7.48 KB)
📄
ipsock_plan9_test.go
(645 B)
📄
ipsock_posix.go
(7.86 KB)
📄
ipsock_test.go
(6.81 KB)
📄
listen_test.go
(20.5 KB)
📄
lookup.go
(29.04 KB)
📄
lookup_plan9.go
(9.94 KB)
📄
lookup_test.go
(40.62 KB)
📄
lookup_unix.go
(3.35 KB)
📄
lookup_windows.go
(13.8 KB)
📄
lookup_windows_test.go
(8.93 KB)
📄
mac.go
(1.88 KB)
📄
mac_test.go
(3.26 KB)
📁
mail
📄
main_cloexec_test.go
(693 B)
📄
main_conf_test.go
(1.39 KB)
📄
main_noconf_test.go
(467 B)
📄
main_plan9_test.go
(392 B)
📄
main_posix_test.go
(1.37 KB)
📄
main_test.go
(7.53 KB)
📄
main_unix_test.go
(1.19 KB)
📄
main_wasm_test.go
(284 B)
📄
main_windows_test.go
(1 KB)
📄
mockserver_test.go
(10.77 KB)
📄
mptcpsock_linux.go
(3.96 KB)
📄
mptcpsock_linux_test.go
(4.06 KB)
📄
mptcpsock_stub.go
(542 B)
📄
net.go
(24.56 KB)
📄
net_fake.go
(26.36 KB)
📄
net_fake_test.go
(2.79 KB)
📄
net_test.go
(14 KB)
📄
net_windows_test.go
(16.28 KB)
📄
netcgo_off.go
(222 B)
📄
netcgo_on.go
(220 B)
📄
netgo_netcgo.go
(453 B)
📄
netgo_off.go
(220 B)
📄
netgo_on.go
(218 B)
📁
netip
📄
nss.go
(5.48 KB)
📄
nss_test.go
(3.4 KB)
📄
packetconn_test.go
(3.02 KB)
📄
parse.go
(6.04 KB)
📄
parse_test.go
(1.55 KB)
📄
pipe.go
(5.43 KB)
📄
pipe_test.go
(1.2 KB)
📄
platform_test.go
(4.33 KB)
📄
port.go
(1.46 KB)
📄
port_test.go
(1.34 KB)
📄
port_unix.go
(1.24 KB)
📄
protoconn_test.go
(7.44 KB)
📄
rawconn.go
(2.7 KB)
📄
rawconn_stub_test.go
(631 B)
📄
rawconn_test.go
(4.33 KB)
📄
rawconn_unix_test.go
(2.96 KB)
📄
rawconn_windows_test.go
(3.12 KB)
📄
resolverdialfunc_test.go
(8.25 KB)
📄
rlimit_js.go
(346 B)
📄
rlimit_unix.go
(1.1 KB)
📁
rpc
📄
sendfile_linux.go
(1.12 KB)
📄
sendfile_linux_test.go
(1.93 KB)
📄
sendfile_stub.go
(344 B)
📄
sendfile_test.go
(8.25 KB)
📄
sendfile_unix_alt.go
(2.04 KB)
📄
sendfile_windows.go
(1.02 KB)
📄
server_test.go
(11.67 KB)
📁
smtp
📄
sock_bsd.go
(918 B)
📄
sock_cloexec.go
(1.38 KB)
📄
sock_linux.go
(993 B)
📄
sock_linux_test.go
(575 B)
📄
sock_plan9.go
(262 B)
📄
sock_posix.go
(6.29 KB)
📄
sock_stub.go
(390 B)
📄
sock_windows.go
(802 B)
📄
sockaddr_posix.go
(1.45 KB)
📄
sockopt_aix.go
(1.43 KB)
📄
sockopt_bsd.go
(2.21 KB)
📄
sockopt_fake.go
(955 B)
📄
sockopt_linux.go
(1.25 KB)
📄
sockopt_plan9.go
(406 B)
📄
sockopt_posix.go
(2.13 KB)
📄
sockopt_solaris.go
(1.25 KB)
📄
sockopt_windows.go
(1.51 KB)
📄
sockoptip_bsdvar.go
(867 B)
📄
sockoptip_linux.go
(735 B)
📄
sockoptip_posix.go
(1.38 KB)
📄
sockoptip_stub.go
(769 B)
📄
sockoptip_windows.go
(786 B)
📄
splice_linux.go
(1.69 KB)
📄
splice_stub.go
(376 B)
📄
splice_test.go
(13.48 KB)
📄
sys_cloexec.go
(962 B)
📄
tcpsock.go
(11.75 KB)
📄
tcpsock_plan9.go
(2.18 KB)
📄
tcpsock_posix.go
(6.16 KB)
📄
tcpsock_test.go
(17.68 KB)
📄
tcpsock_unix_test.go
(2.34 KB)
📄
tcpsockopt_darwin.go
(770 B)
📄
tcpsockopt_dragonfly.go
(698 B)
📄
tcpsockopt_openbsd.go
(365 B)
📄
tcpsockopt_plan9.go
(525 B)
📄
tcpsockopt_posix.go
(442 B)
📄
tcpsockopt_solaris.go
(1.15 KB)
📄
tcpsockopt_stub.go
(399 B)
📄
tcpsockopt_unix.go
(722 B)
📄
tcpsockopt_windows.go
(741 B)
📁
testdata
📁
textproto
📄
timeout_test.go
(29.11 KB)
📄
udpsock.go
(11.83 KB)
📄
udpsock_plan9.go
(4.64 KB)
📄
udpsock_plan9_test.go
(1.31 KB)
📄
udpsock_posix.go
(7.53 KB)
📄
udpsock_test.go
(17.24 KB)
📄
unixsock.go
(10.12 KB)
📄
unixsock_linux_test.go
(2.29 KB)
📄
unixsock_plan9.go
(1.24 KB)
📄
unixsock_posix.go
(6.64 KB)
📄
unixsock_readmsg_cloexec.go
(654 B)
📄
unixsock_readmsg_cmsg_cloexec.go
(332 B)
📄
unixsock_readmsg_other.go
(275 B)
📄
unixsock_readmsg_test.go
(2.51 KB)
📄
unixsock_test.go
(10.64 KB)
📄
unixsock_windows_test.go
(2.03 KB)
📁
url
📄
write_unix_test.go
(1.61 KB)
📄
writev_test.go
(5.03 KB)
📄
writev_unix.go
(666 B)
Editing: addrselect.go
// Copyright 2015 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. // Minimal RFC 6724 address selection. package net import ( "net/netip" "sort" ) func sortByRFC6724(addrs []IPAddr) { if len(addrs) < 2 { return } sortByRFC6724withSrcs(addrs, srcAddrs(addrs)) } func sortByRFC6724withSrcs(addrs []IPAddr, srcs []netip.Addr) { if len(addrs) != len(srcs) { panic("internal error") } addrAttr := make([]ipAttr, len(addrs)) srcAttr := make([]ipAttr, len(srcs)) for i, v := range addrs { addrAttrIP, _ := netip.AddrFromSlice(v.IP) addrAttr[i] = ipAttrOf(addrAttrIP) srcAttr[i] = ipAttrOf(srcs[i]) } sort.Stable(&byRFC6724{ addrs: addrs, addrAttr: addrAttr, srcs: srcs, srcAttr: srcAttr, }) } // srcAddrs tries to UDP-connect to each address to see if it has a // route. (This doesn't send any packets). The destination port // number is irrelevant. func srcAddrs(addrs []IPAddr) []netip.Addr { srcs := make([]netip.Addr, len(addrs)) dst := UDPAddr{Port: 9} for i := range addrs { dst.IP = addrs[i].IP dst.Zone = addrs[i].Zone c, err := DialUDP("udp", nil, &dst) if err == nil { if src, ok := c.LocalAddr().(*UDPAddr); ok { srcs[i], _ = netip.AddrFromSlice(src.IP) } c.Close() } } return srcs } type ipAttr struct { Scope scope Precedence uint8 Label uint8 } func ipAttrOf(ip netip.Addr) ipAttr { if !ip.IsValid() { return ipAttr{} } match := rfc6724policyTable.Classify(ip) return ipAttr{ Scope: classifyScope(ip), Precedence: match.Precedence, Label: match.Label, } } type byRFC6724 struct { addrs []IPAddr // addrs to sort addrAttr []ipAttr srcs []netip.Addr // or not valid addr if unreachable srcAttr []ipAttr } func (s *byRFC6724) Len() int { return len(s.addrs) } func (s *byRFC6724) Swap(i, j int) { s.addrs[i], s.addrs[j] = s.addrs[j], s.addrs[i] s.srcs[i], s.srcs[j] = s.srcs[j], s.srcs[i] s.addrAttr[i], s.addrAttr[j] = s.addrAttr[j], s.addrAttr[i] s.srcAttr[i], s.srcAttr[j] = s.srcAttr[j], s.srcAttr[i] } // Less reports whether i is a better destination address for this // host than j. // // The algorithm and variable names comes from RFC 6724 section 6. func (s *byRFC6724) Less(i, j int) bool { DA := s.addrs[i].IP DB := s.addrs[j].IP SourceDA := s.srcs[i] SourceDB := s.srcs[j] attrDA := &s.addrAttr[i] attrDB := &s.addrAttr[j] attrSourceDA := &s.srcAttr[i] attrSourceDB := &s.srcAttr[j] const preferDA = true const preferDB = false // Rule 1: Avoid unusable destinations. // If DB is known to be unreachable or if Source(DB) is undefined, then // prefer DA. Similarly, if DA is known to be unreachable or if // Source(DA) is undefined, then prefer DB. if !SourceDA.IsValid() && !SourceDB.IsValid() { return false // "equal" } if !SourceDB.IsValid() { return preferDA } if !SourceDA.IsValid() { return preferDB } // Rule 2: Prefer matching scope. // If Scope(DA) = Scope(Source(DA)) and Scope(DB) <> Scope(Source(DB)), // then prefer DA. Similarly, if Scope(DA) <> Scope(Source(DA)) and // Scope(DB) = Scope(Source(DB)), then prefer DB. if attrDA.Scope == attrSourceDA.Scope && attrDB.Scope != attrSourceDB.Scope { return preferDA } if attrDA.Scope != attrSourceDA.Scope && attrDB.Scope == attrSourceDB.Scope { return preferDB } // Rule 3: Avoid deprecated addresses. // If Source(DA) is deprecated and Source(DB) is not, then prefer DB. // Similarly, if Source(DA) is not deprecated and Source(DB) is // deprecated, then prefer DA. // TODO(bradfitz): implement? low priority for now. // Rule 4: Prefer home addresses. // If Source(DA) is simultaneously a home address and care-of address // and Source(DB) is not, then prefer DA. Similarly, if Source(DB) is // simultaneously a home address and care-of address and Source(DA) is // not, then prefer DB. // TODO(bradfitz): implement? low priority for now. // Rule 5: Prefer matching label. // If Label(Source(DA)) = Label(DA) and Label(Source(DB)) <> Label(DB), // then prefer DA. Similarly, if Label(Source(DA)) <> Label(DA) and // Label(Source(DB)) = Label(DB), then prefer DB. if attrSourceDA.Label == attrDA.Label && attrSourceDB.Label != attrDB.Label { return preferDA } if attrSourceDA.Label != attrDA.Label && attrSourceDB.Label == attrDB.Label { return preferDB } // Rule 6: Prefer higher precedence. // If Precedence(DA) > Precedence(DB), then prefer DA. Similarly, if // Precedence(DA) < Precedence(DB), then prefer DB. if attrDA.Precedence > attrDB.Precedence { return preferDA } if attrDA.Precedence < attrDB.Precedence { return preferDB } // Rule 7: Prefer native transport. // If DA is reached via an encapsulating transition mechanism (e.g., // IPv6 in IPv4) and DB is not, then prefer DB. Similarly, if DB is // reached via encapsulation and DA is not, then prefer DA. // TODO(bradfitz): implement? low priority for now. // Rule 8: Prefer smaller scope. // If Scope(DA) < Scope(DB), then prefer DA. Similarly, if Scope(DA) > // Scope(DB), then prefer DB. if attrDA.Scope < attrDB.Scope { return preferDA } if attrDA.Scope > attrDB.Scope { return preferDB } // Rule 9: Use the longest matching prefix. // When DA and DB belong to the same address family (both are IPv6 or // both are IPv4 [but see below]): If CommonPrefixLen(Source(DA), DA) > // CommonPrefixLen(Source(DB), DB), then prefer DA. Similarly, if // CommonPrefixLen(Source(DA), DA) < CommonPrefixLen(Source(DB), DB), // then prefer DB. // // However, applying this rule to IPv4 addresses causes // problems (see issues 13283 and 18518), so limit to IPv6. if DA.To4() == nil && DB.To4() == nil { commonA := commonPrefixLen(SourceDA, DA) commonB := commonPrefixLen(SourceDB, DB) if commonA > commonB { return preferDA } if commonA < commonB { return preferDB } } // Rule 10: Otherwise, leave the order unchanged. // If DA preceded DB in the original list, prefer DA. // Otherwise, prefer DB. return false // "equal" } type policyTableEntry struct { Prefix netip.Prefix Precedence uint8 Label uint8 } type policyTable []policyTableEntry // RFC 6724 section 2.1. // Items are sorted by the size of their Prefix.Mask.Size, var rfc6724policyTable = policyTable{ { // "::1/128" Prefix: netip.PrefixFrom(netip.AddrFrom16([16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01}), 128), Precedence: 50, Label: 0, }, { // "::ffff:0:0/96" // IPv4-compatible, etc. Prefix: netip.PrefixFrom(netip.AddrFrom16([16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff}), 96), Precedence: 35, Label: 4, }, { // "::/96" Prefix: netip.PrefixFrom(netip.AddrFrom16([16]byte{}), 96), Precedence: 1, Label: 3, }, { // "2001::/32" // Teredo Prefix: netip.PrefixFrom(netip.AddrFrom16([16]byte{0x20, 0x01}), 32), Precedence: 5, Label: 5, }, { // "2002::/16" // 6to4 Prefix: netip.PrefixFrom(netip.AddrFrom16([16]byte{0x20, 0x02}), 16), Precedence: 30, Label: 2, }, { // "3ffe::/16" Prefix: netip.PrefixFrom(netip.AddrFrom16([16]byte{0x3f, 0xfe}), 16), Precedence: 1, Label: 12, }, { // "fec0::/10" Prefix: netip.PrefixFrom(netip.AddrFrom16([16]byte{0xfe, 0xc0}), 10), Precedence: 1, Label: 11, }, { // "fc00::/7" Prefix: netip.PrefixFrom(netip.AddrFrom16([16]byte{0xfc}), 7), Precedence: 3, Label: 13, }, { // "::/0" Prefix: netip.PrefixFrom(netip.AddrFrom16([16]byte{}), 0), Precedence: 40, Label: 1, }, } // Classify returns the policyTableEntry of the entry with the longest // matching prefix that contains ip. // The table t must be sorted from largest mask size to smallest. func (t policyTable) Classify(ip netip.Addr) policyTableEntry { // Prefix.Contains() will not match an IPv6 prefix for an IPv4 address. if ip.Is4() { ip = netip.AddrFrom16(ip.As16()) } for _, ent := range t { if ent.Prefix.Contains(ip) { return ent } } return policyTableEntry{} } // RFC 6724 section 3.1. type scope uint8 const ( scopeInterfaceLocal scope = 0x1 scopeLinkLocal scope = 0x2 scopeAdminLocal scope = 0x4 scopeSiteLocal scope = 0x5 scopeOrgLocal scope = 0x8 scopeGlobal scope = 0xe ) func classifyScope(ip netip.Addr) scope { if ip.IsLoopback() || ip.IsLinkLocalUnicast() { return scopeLinkLocal } ipv6 := ip.Is6() && !ip.Is4In6() ipv6AsBytes := ip.As16() if ipv6 && ip.IsMulticast() { return scope(ipv6AsBytes[1] & 0xf) } // Site-local addresses are defined in RFC 3513 section 2.5.6 // (and deprecated in RFC 3879). if ipv6 && ipv6AsBytes[0] == 0xfe && ipv6AsBytes[1]&0xc0 == 0xc0 { return scopeSiteLocal } return scopeGlobal } // commonPrefixLen reports the length of the longest prefix (looking // at the most significant, or leftmost, bits) that the // two addresses have in common, up to the length of a's prefix (i.e., // the portion of the address not including the interface ID). // // If a or b is an IPv4 address as an IPv6 address, the IPv4 addresses // are compared (with max common prefix length of 32). // If a and b are different IP versions, 0 is returned. // // See https://tools.ietf.org/html/rfc6724#section-2.2 func commonPrefixLen(a netip.Addr, b IP) (cpl int) { if b4 := b.To4(); b4 != nil { b = b4 } aAsSlice := a.AsSlice() if len(aAsSlice) != len(b) { return 0 } // If IPv6, only up to the prefix (first 64 bits) if len(aAsSlice) > 8 { aAsSlice = aAsSlice[:8] b = b[:8] } for len(aAsSlice) > 0 { if aAsSlice[0] == b[0] { cpl += 8 aAsSlice = aAsSlice[1:] b = b[1:] continue } bits := 8 ab, bb := aAsSlice[0], b[0] for { ab >>= 1 bb >>= 1 bits-- if ab == bb { cpl += bits return } } } return }
Upload File
Create Folder