1
nybux 2015-01-22 13:54:45 +08:00
用Dialer进行连接,Dialer的LocalAddr设置接口指定的IP,如果不确定ip,可以通过InterfaceByName来获取
|
2
yuhua OP 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 2015-01-22 15:48:25 +08:00 1
那就用cgo,自己先创建个socket出来,然后用new.FileConn+os.NewFile包装出一个net.Conn对象出来
|
4
yuhua OP 哎..还是太麻烦点了。后来考量下业务觉得改用python估计问题也不大。还是谢谢啦~
|
5
mitch 2019-06-26 16:27:46 +08:00
今天遇到同样问题,简单搜索了一下,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 } }) }, } |