25 lines
616 B
Go
25 lines
616 B
Go
//go:build linux
|
|
|
|
package transport
|
|
|
|
import (
|
|
"fmt"
|
|
"syscall"
|
|
)
|
|
|
|
// udpBindDeviceControl 返回一个 Control 函数,用于在 Linux 上将 UDP socket 绑定到指定网卡设备。
|
|
func udpBindDeviceControl(device string) (func(string, string, syscall.RawConn) error, error) {
|
|
return func(_, _ string, rawConn syscall.RawConn) error {
|
|
var bindErr error
|
|
if err := rawConn.Control(func(fd uintptr) {
|
|
bindErr = syscall.BindToDevice(int(fd), device)
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if bindErr != nil {
|
|
return fmt.Errorf("transport: bind device %s: %w", device, bindErr)
|
|
}
|
|
return nil
|
|
}, nil
|
|
}
|