我在服务器上绑定了几个vpn,即ppp0~ppp4。
现在出现了问题。我想开始5个进程,每个进程使用不同的网络接口
proc0 - > ppp0的
proc1 - > PPP1
proc2 - > ppp2
proc3 - > ppp3
proc4 - > ppp4
我现在用c语言怎么做。只需使用带参数SO_BINDTODEVICE的setsockopt。
但是如何在golang中使用net package做到这一点?
答案 0 :(得分:1)
您可能希望net.Interfaces()
获得表示系统中网络接口的net.Interface()
切片,或者,如您所知,接口名称可以使用net.InterfaceByName()
来获取特定内容net.Interface
。
ppp0, err := net.InterfaceByName("ppp0")
然后,您可以在返回的net.Interface
上拨打Interface.Addrs()
并获取该接口的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,并通过通道移动流量,但这实际上取决于您要执行的操作。 (您只是记录数据,发送数据,修改数据等。)
答案 1 :(得分:0)
拨号器的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