【发布时间】:2015-02-09 05:21:44
【问题描述】:
我的计算机上有两个网络接口(eth0 和 eth1),我正在尝试使用特定的网络接口(eth1)拨号连接。鉴于 Go 是一种系统语言的声明,我认为是这样,但当前的标准库真的有可能吗?
到目前为止,我必须通过名称InterfaceByName (eth1) 获取接口,然后我覆盖Addrs 方法并提取第一个地址 [0],这似乎是 eth1 接口的源地址(例如 xxx.xxx.xxx/24);另一个是 ipv6 地址。
我创建了一个新的Dialer 并使用提取的地址设置Dialer.LocalAddr。但是我收到此错误mismatched local address type 似乎与dial.go 中的 dialSingle 函数有关
编辑 一些代码:
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
【问题讨论】:
-
我在重现这个问题时遇到了麻烦——你能举例说明你是如何获取地址和创建拨号器的吗?
-
@JimB 感谢您的调查。我已经发布了一些代码。无论我使用的是什么地址/接口,似乎我都会收到错误,所以我只能假设我在
Dialer.LocalAddr中提供的地址不是它通过编译所期望的形式。我调查过,似乎 Go 分配的默认类型具有相同的 IP 地址(接口的 src),但也有一个端口号。我不确定为什么需要端口以及如何获取/分配它。 -
使用端口:0,这可能是规范的一部分,因为某些协议可能需要特定的源端口,因此他们需要某种方式让您指定。 :0 是临时的“随机”(未使用)端口
-
@DavidBudworth 谢谢!仍然 Addr[golang.org/pkg/net/#Addr] 似乎是一个接口。我是否应该调用 String() 方法,将子网 (/24) 替换为端口号并将其转换/实现为接口?
-
这是一个关于游戏的例子。事实证明你需要 *net.IPNet 然后获取那个人的 IP。 play.golang.org/p/E3iXXpq0mD(这个抓我mac wifi卡的addr,把en0改成eth1)
标签: networking go network-programming