Go 要使用什么系统调用来获取某些RTF_*标志的值
使用,我想从手册页获得一些Go 要使用什么系统调用来获取某些RTF_*标志的值,go,network-programming,system-calls,Go,Network Programming,System Calls,使用,我想从手册页获得一些RTF.*标志(UGHS)的值: G RTF_GATEWAY Destination requires forwarding by intermediary H RTF_HOST Host entry (net otherwise) S RTF_STATIC Manually added U RTF_UP Route usable 知道我可以使用什么样的系统调用/方法来检索DOS值吗?我看到它们已声明,但想知道
RTF.*
标志(UGHS)的值:
G RTF_GATEWAY Destination requires forwarding by intermediary
H RTF_HOST Host entry (net otherwise)
S RTF_STATIC Manually added
U RTF_UP Route usable
知道我可以使用什么样的系统调用/方法来检索DOS值吗?我看到它们已声明,但想知道如何使用它们
我需要这个来查找添加到路由表中的网关IP,主要是在连接到VPN时,目前使用netstat(使用macOS、FreeBSD)实现此目的:
有什么想法吗?相当于strace netstat(MacOS上的DTRUS,请参阅)应该会给您一个系统调用列表,您可以决定需要为您的问题进行哪些系统调用。正如@JimB通过使用包所建议的那样,我能够查询当前路由并只获得与某些标志匹配的IP,在这种情况下,“
UGSH
,UGSc
基本示例代码:
package main
import (
"fmt"
"net"
"syscall"
"golang.org/x/net/route"
)
const (
UGSH = syscall.RTF_UP | syscall.RTF_GATEWAY | syscall.RTF_STATIC | syscall.RTF_HOST
UGSc = syscall.RTF_UP | syscall.RTF_GATEWAY | syscall.RTF_STATIC | syscall.RTF_PRCLONING
)
func main() {
if rib, err := route.FetchRIB(syscall.AF_UNSPEC, route.RIBTypeRoute, 0); err == nil {
if msgs, err := route.ParseRIB(route.RIBTypeRoute, rib); err == nil {
for _, msg := range msgs {
m := msg.(*route.RouteMessage)
if m.Flags == UGSH || m.Flags == UGSc {
var ip net.IP
switch a := m.Addrs[syscall.AF_UNSPEC].(type) {
case *route.Inet4Addr:
ip = net.IPv4(a.IP[0], a.IP[1], a.IP[2], a.IP[3])
case *route.Inet6Addr:
ip = make(net.IP, net.IPv6len)
copy(ip, a.IP[:])
}
fmt.Printf("ip = %s\n", ip)
}
}
}
}
}
你看了吗?@JimB,谢谢,我正在看。谢谢,但macOs或FreeBSD需要这个,没有linuxIt。macOs似乎有一个与strace相当的版本。请看:
package main
import (
"fmt"
"net"
"syscall"
"golang.org/x/net/route"
)
const (
UGSH = syscall.RTF_UP | syscall.RTF_GATEWAY | syscall.RTF_STATIC | syscall.RTF_HOST
UGSc = syscall.RTF_UP | syscall.RTF_GATEWAY | syscall.RTF_STATIC | syscall.RTF_PRCLONING
)
func main() {
if rib, err := route.FetchRIB(syscall.AF_UNSPEC, route.RIBTypeRoute, 0); err == nil {
if msgs, err := route.ParseRIB(route.RIBTypeRoute, rib); err == nil {
for _, msg := range msgs {
m := msg.(*route.RouteMessage)
if m.Flags == UGSH || m.Flags == UGSc {
var ip net.IP
switch a := m.Addrs[syscall.AF_UNSPEC].(type) {
case *route.Inet4Addr:
ip = net.IPv4(a.IP[0], a.IP[1], a.IP[2], a.IP[3])
case *route.Inet6Addr:
ip = make(net.IP, net.IPv6len)
copy(ip, a.IP[:])
}
fmt.Printf("ip = %s\n", ip)
}
}
}
}
}