我的计算机上有两个网络接口(eth0和eth1),并且我正在尝试使用特定的接口(eth1)拨号连接。考虑到我假设Go是一种系统语言,但是当前的标准库是否真的有可能?
到目前为止,我必须通过名称InterfaceByName(eth1)获取接口,然后遍历该Addrs方法并提取第一个地址[0],该地址似乎是eth1接口的源地址(例如xxx.xxx.xxx/24);另一个是ipv6地址。 我创建了一个新的地址Dialer并设置Dialer.LocalAddr了地址。但是我得到的错误mismatched local address type似乎与Dial.go的DialSingle函数有关
InterfaceByName
eth1
Addrs
Dialer
Dialer.LocalAddr
mismatched local address type
编辑 一些代码:
package main import ( "net" "log" ) func main(){ ief, err := net.InterfaceByName("eth1") if err !=nil{ log.Fatal(err) } addrs, err := ief.Addrs() if err !=nil{ log.Fatal(err) } d := net.Dialer{LocalAddr: addrs[0]} _, err = d.Dial("tcp", "google.com:80") if err != nil { log.Fatal(err) } }
输出: 2014/12/10 17:11:48 dial tcp 216.58.208.32:80: mismatched local address type ip+net
2014/12/10 17:11:48 dial tcp 216.58.208.32:80: mismatched local address type ip+net
当您从接口提取地址时,它的类型就是*net.IPnet包装在net.Addr接口中的接口,该接口包含和地址和网络掩码,而不是地址和端口。您可以将IP地址声明为一个IP地址,然后使用它来创建一个新的TCPAddr。*net.IPnet
*net.IPnet
net.Addr
ief, err := net.InterfaceByName("eth1") if err !=nil{ log.Fatal(err) } addrs, err := ief.Addrs() if err !=nil{ log.Fatal(err) } tcpAddr := &net.TCPAddr{ IP: addrs[0].(*net.IPNet).IP, }