ping: Fix control

This commit is contained in:
世界 2025-08-24 12:39:50 +08:00
parent dd18aa2b86
commit 7f41766568
No known key found for this signature in database
GPG key ID: CD109927C34A63C4

View file

@ -12,7 +12,6 @@ import (
"github.com/sagernet/sing/common/control" "github.com/sagernet/sing/common/control"
E "github.com/sagernet/sing/common/exceptions" E "github.com/sagernet/sing/common/exceptions"
M "github.com/sagernet/sing/common/metadata" M "github.com/sagernet/sing/common/metadata"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -42,11 +41,17 @@ func connect(privileged bool, controlFunc control.Func, destination netip.Addr)
} }
file := os.NewFile(uintptr(fd), "datagram-oriented icmp") file := os.NewFile(uintptr(fd), "datagram-oriented icmp")
defer file.Close() defer file.Close()
err = unix.Connect(fd, M.AddrPortToSockaddr(netip.AddrPortFrom(destination, 0))) if controlFunc != nil {
var syscallConn syscall.RawConn
syscallConn, err = file.SyscallConn()
if err != nil { if err != nil {
return nil, E.Cause(err, "connect()") return nil, err
}
err = controlFunc(network, destination.String(), syscallConn)
if err != nil {
return nil, err
}
} }
if destination.Is4() && (runtime.GOOS == "linux" || runtime.GOOS == "android") { if destination.Is4() && (runtime.GOOS == "linux" || runtime.GOOS == "android") {
//err = unix.SetsockoptInt(fd, unix.IPPROTO_IP, unix.IP_RECVTOS, 1) //err = unix.SetsockoptInt(fd, unix.IPPROTO_IP, unix.IP_RECVTOS, 1)
//if err != nil { //if err != nil {
@ -68,20 +73,14 @@ func connect(privileged bool, controlFunc control.Func, destination netip.Addr)
} }
} }
err = unix.Connect(fd, M.AddrPortToSockaddr(netip.AddrPortFrom(destination, 0)))
if err != nil {
return nil, E.Cause(err, "connect()")
}
conn, err := net.FileConn(file) conn, err := net.FileConn(file)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if controlFunc != nil {
var syscallConn syscall.RawConn
syscallConn, err = conn.(syscall.Conn).SyscallConn()
if err != nil {
return nil, err
}
err = controlFunc(network, destination.String(), syscallConn)
if err != nil {
return nil, err
}
}
return conn, nil return conn, nil
} }