【问题标题】:what syscall to use in order to obtain the value of some RTF_* flags使用什么系统调用来获取一些 RTF_* 标志的值
【发布时间】:2017-08-13 07:30:53
【问题描述】:

使用go,我想从netstat(1) 手册页获取一些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

知道我可以使用什么系统调用/方法来检索值吗?我看到它们被声明为 https://golang.org/pkg/syscall/ 但想知道如何使用它们?

我需要这个来查找添加到路由表中的网关的 IP,主要是在连接到 VPN 时,目前使用 netstat 进行此操作(使用 macOS,FreeBSD):

 netstat -rna -f inet | grep UGHS | awk '{print $1}' 

有什么想法吗?

【问题讨论】:

  • 你看过route package吗?
  • @JimB,谢谢,我正在调查。

标签: go network-programming system-calls


【解决方案1】:

正如@JimB 通过使用route 包所建议的那样,我能够查询当前路由并仅获得与某些标志匹配的IP,在这种情况下为“UGSHUGSc

基本示例代码:

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)
                }
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    相当于strace netstat(MacOS 上的 dtruss,请参阅https://opensourcehacker.com/2011/12/02/osx-strace-equivalent-dtruss-seeing-inside-applications-what-they-do-and-why-they-hang/)应该为您提供它发出的系统调用列表,您可以决定需要为您的问题发出哪些系统调用。

    【讨论】:

    猜你喜欢
    • 2019-07-10
    • 2016-03-06
    • 2012-12-09
    • 2013-07-07
    • 2011-09-25
    • 1970-01-01
    • 2020-08-12
    • 2012-02-26
    • 2017-04-02
    相关资源
    最近更新 更多