2024-05-01 16:17:44 +08:00
|
|
|
package backtrace
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net"
|
|
|
|
"syscall"
|
2024-06-24 16:01:58 +08:00
|
|
|
|
|
|
|
. "github.com/oneclickvirt/defaultset"
|
2024-05-01 16:17:44 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
func (t *Tracer) listen(network string, laddr *net.IPAddr) (*net.IPConn, error) {
|
2024-06-24 16:01:58 +08:00
|
|
|
if EnableLoger {
|
|
|
|
InitLogger()
|
|
|
|
defer Logger.Sync()
|
|
|
|
conn, err := net.ListenIP(network, laddr)
|
|
|
|
if err != nil {
|
|
|
|
Logger.Info(err.Error())
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
raw, err := conn.SyscallConn()
|
|
|
|
if err != nil {
|
|
|
|
Logger.Info(err.Error())
|
|
|
|
conn.Close()
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
_ = raw.Control(func(fd uintptr) {
|
|
|
|
err = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_HDRINCL, 1)
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
Logger.Info(err.Error())
|
|
|
|
conn.Close()
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return conn, nil
|
|
|
|
} else {
|
|
|
|
conn, err := net.ListenIP(network, laddr)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
raw, err := conn.SyscallConn()
|
|
|
|
if err != nil {
|
|
|
|
conn.Close()
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
_ = raw.Control(func(fd uintptr) {
|
|
|
|
err = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_HDRINCL, 1)
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
conn.Close()
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return conn, nil
|
2024-05-01 16:17:44 +08:00
|
|
|
}
|
|
|
|
}
|