mirror of
https://github.com/cmz0228/hysteria-dev.git
synced 2025-09-08 09:21:49 +00:00
.github
cmd
docs
pkg
acl
congestion
conns
core
http
obfs
pmtud_fix
relay
socks5
tproxy
transport
client.go
resolve.go
server.go
socks5.go
tun
utils
.gitignore
CHANGELOG.md
Dockerfile
LICENSE.md
README.md
docker-compose.yaml
go.mod
go.sum
install_server.sh
59 lines
1.1 KiB
Go
59 lines
1.1 KiB
Go
package transport
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net"
|
|
)
|
|
|
|
var (
|
|
errNoIPv4Addr = errors.New("no IPv4 address")
|
|
errNoIPv6Addr = errors.New("no IPv6 address")
|
|
)
|
|
|
|
func resolveIPAddrWithPreference(address string, preferIPv6 bool, exclusive bool) (*net.IPAddr, error) {
|
|
ips, err := net.LookupIP(address)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if preferIPv6 {
|
|
for _, ip := range ips {
|
|
if ip.To4() == nil {
|
|
return &net.IPAddr{IP: ip}, nil
|
|
}
|
|
}
|
|
if exclusive {
|
|
return nil, errNoIPv6Addr
|
|
} else {
|
|
return &net.IPAddr{IP: ips[0]}, nil
|
|
}
|
|
} else {
|
|
// prefer IPv4
|
|
for _, ip := range ips {
|
|
if ip.To4() != nil {
|
|
return &net.IPAddr{IP: ip}, nil
|
|
}
|
|
}
|
|
if exclusive {
|
|
return nil, errNoIPv4Addr
|
|
} else {
|
|
return &net.IPAddr{IP: ips[0]}, nil
|
|
}
|
|
}
|
|
}
|
|
|
|
func ResolvePreferenceFromString(preference string) (bool, bool, error) {
|
|
switch preference {
|
|
case "4":
|
|
return false, true, nil
|
|
case "6":
|
|
return true, true, nil
|
|
case "46":
|
|
return false, false, nil
|
|
case "64":
|
|
return true, false, nil
|
|
default:
|
|
return false, false, fmt.Errorf("%s is not a valid preference", preference)
|
|
}
|
|
}
|