2 回答
TA贡献1789条经验 获得超8个赞
您可能希望net.Interfaces()获得net.Interface()代表系统上网络接口的片段,或者,如您所知的接口名称,您可以使用它net.InterfaceByName()来获取特定的net.Interface.
ppp0, err := net.InterfaceByName("ppp0")
然后您可以调用Interface.Addrs()返回的net.Interface并获取接口的 IP 地址。
addrs, err := ppp0.Addrs()
然后,您可以在其余代码中使用所需的地址(可能使用net.ListenIP或net.DialIP.
addr, err := net.ResolveIPAddr("ip4", addrs[0])
// check err
conn, err := net.ListenIP("ip4:pptp", addr)
// check err, then do stuff with conn
关于同时为多个接口执行此操作,您可以为每个侦听器/接口启动一个 goroutine,并通过通道移动流量,但这实际上取决于您想要做什么。(您只是记录数据、发送数据、修改数据等吗?)
TA贡献1982条经验 获得超2个赞
拨号器的 LocalAddr 不适用于 ppp 接口,我们应该SOL_SOCKET使用将标志设置为套接字setsockopt,对于 go 1.11+,您可以创建这样的拨号器
dialer := net.Dialer{
Control: func(network, address string, c syscall.RawConn) error {
return c.Control(func(fd uintptr) {
err := syscall.SetsockoptString(int(fd), syscall.SOL_SOCKET, 25, "ppp0")
if err != nil {
log.Printf("control: %s", err)
return
}
})
},
}
// use the dialer
- 2 回答
- 0 关注
- 165 浏览
添加回答
举报