mirror of
https://github.com/datarhei/core.git
synced 2025-10-19 06:14:45 +08:00
66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
//go:build !windows
|
|
|
|
package srt
|
|
|
|
import "syscall"
|
|
|
|
func ListenControl(config Config) func(network, address string, c syscall.RawConn) error {
|
|
return func(network, address string, c syscall.RawConn) error {
|
|
var opErr error
|
|
err := c.Control(func(fd uintptr) {
|
|
// Set REUSEADDR
|
|
opErr = syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
|
|
if opErr != nil {
|
|
return
|
|
}
|
|
|
|
// Set TOS
|
|
if config.IPTOS > 0 {
|
|
opErr = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_TOS, config.IPTOS)
|
|
if opErr != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
// Set TTL
|
|
if config.IPTTL > 0 {
|
|
opErr = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_TTL, config.IPTTL)
|
|
if opErr != nil {
|
|
return
|
|
}
|
|
}
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return opErr
|
|
}
|
|
}
|
|
|
|
func DialControl(config Config) func(network string, address string, c syscall.RawConn) error {
|
|
return func(network, address string, c syscall.RawConn) error {
|
|
var opErr error
|
|
err := c.Control(func(fd uintptr) {
|
|
// Set TOS
|
|
if config.IPTOS > 0 {
|
|
opErr = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_TOS, config.IPTOS)
|
|
if opErr != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
// Set TTL
|
|
if config.IPTTL > 0 {
|
|
opErr = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_TTL, config.IPTTL)
|
|
if opErr != nil {
|
|
return
|
|
}
|
|
}
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return opErr
|
|
}
|
|
}
|