This topic created in 4131 days ago, the information mentioned may be changed or developed.
现在我的服务器上挂了5个vpn(pptp),ppp0~ppp5
我想启动5个进程,每个进程使用不同的vpn
proc0 -> ppp0
proc1 -> ppp1
proc2 -> ppp2
proc3 -> ppp3
proc4 -> ppp4
用c的话可以通过SO_BINDTODIVICE实现
现在想用golang的net包来实验,有哪位大牛实现过的?求教
5 replies • 2019-06-26 16:27:46 +08:00
 |
|
1
nybux Jan 22, 2015
用Dialer进行连接,Dialer的LocalAddr设置接口指定的IP,如果不确定ip,可以通过InterfaceByName来获取
|
 |
|
2
yuhua Jan 22, 2015
ief, err := net.InterfaceByName(netInterface) if err != nil { fmt.Println(err) } addrs, err := ief.Addrs() if err != nil { fmt.Println(err) } fmt.Println(addrs[0]) tcpAddr := &net.TCPAddr{ IP: addrs[0].(*net.IPNet).IP, } fmt.Println(tcpAddr) d := net.Dialer{LocalAddr: tcpAddr}
conn, err := d.Dial("tcp", addr) if err != nil { fmt.Println(err) return nil, err }
我试过了,貌似这样不行。一定要通过底层是setsockopt的方法 同样情况下python使用s.setsockopt(socket.SOL_SOCKET, 25, "ppp0"+'\0')通过了测试
|
 |
|
3
nybux Jan 22, 2015 1
那就用cgo,自己先创建个socket出来,然后用new.FileConn+os.NewFile包装出一个net.Conn对象出来
|
 |
|
4
yuhua Jan 22, 2015
哎..还是太麻烦点了。后来考量下业务觉得改用python估计问题也不大。还是谢谢啦~
|
 |
|
5
mitch Jun 26, 2019
今天遇到同样问题,简单搜索了一下,go 1.11 发布后事情简单了点,net 的 dialer 里增加了 Control 的 handler 方便对 socket 进行操作,如下:
---------------------------------
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 } }) }, }
|