Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Networking 使用特定地址/接口拨号?戈兰尼_Networking_Go_Network Programming - Fatal编程技术网

Networking 使用特定地址/接口拨号?戈兰尼

Networking 使用特定地址/接口拨号?戈兰尼,networking,go,network-programming,Networking,Go,Network Programming,我的计算机上有两个网络接口(eth0和eth1),我正在尝试使用一个特定的接口(eth1)拨号连接。假设Go是一种系统语言,我也这么认为,但在当前的标准库中真的有可能吗 到目前为止,我必须按名称获取接口(eth1),然后我对该方法进行范围分析,并提取第一个地址[0],它似乎是eth1接口的源地址(例如xxx.xxx.xxx/24);另一个是ipv6地址。 我已经创建了一个新的和已提取地址的集合。然而,我得到了这个错误不匹配的本地地址类型,它似乎与来自的dialSingle函数有关 编辑 一些代码

我的计算机上有两个网络接口(eth0和eth1),我正在尝试使用一个特定的接口(eth1)拨号连接。假设Go是一种系统语言,我也这么认为,但在当前的标准库中真的有可能吗

到目前为止,我必须按名称获取接口(
eth1
),然后我对该方法进行范围分析,并提取第一个地址[0],它似乎是eth1接口的源地址(例如xxx.xxx.xxx/24);另一个是ipv6地址。
我已经创建了一个新的和已提取地址的集合。然而,我得到了这个错误
不匹配的本地地址类型
,它似乎与来自的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拨号tcp 216.58.208.32:80:不匹配的本地地址类型ip+net

当您从接口中提取地址时,它的类型是
*net.IPnet
封装在
net.Addr
接口中,该接口包含地址和网络掩码而不是地址和端口。您可以使用IP地址,但是,在将其断言为
*net.IPnet

    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,
    }

我很难复制这个——你能举个例子说明你是如何获得地址和创建拨号程序的吗?@JimB谢谢你的关注。我发布了一些代码。似乎不管我使用的地址/接口是什么,我都会收到错误,因此我只能假设我在
拨号程序中提供的地址。LocalAddr
不是它编译时所期望的格式。我已经调查过了,Go分配的默认类型似乎有相同的IP地址(接口的src),但也有一个端口号。我不确定为什么需要该端口以及如何获取/分配它。使用端口:0,它可能是规范的一部分,因为某些协议可能需要特定的源端口,因此它们需要某种方式让您指定:0是短暂的“随机”(未使用)port@DavidBudworth谢谢仍然Addr[似乎是一个接口。我应该调用String()方法,用端口号替换子网(/24)并将其转换/实现为接口吗?下面是一个示例。结果表明,您需要*net.IPNet,然后获取那个家伙的IP。(这将获取我的mac wifi卡的Addr,将en0更改为eth1)非常感谢!我不知道为什么我没有看到你早些时候的答案…不知怎么的,我最终也得到了一个TCPAddr。但是问题是,除非使用的接口是默认接口,否则拨号器无法工作。知道这是一个Go错误还是内核问题吗?默认我指的是在运行
ip route sho时,通过开发人员作为默认提供的一个w
别担心,这似乎是一个驱动程序问题。在某些机器上工作(即在我的mac上),在其他机器上不工作(即在我的服务器上)。请记住,地址顺序不受保证,因此您需要检查是否使用IPv4或IPv6。此外,请注意,绑定到IP不会将您绑定到特定设备。传出设备在路由时确定,由于网络不匹配或存在反向路径检查等限制,流量可能会被阻止。谢谢你的建议。我已经考虑到订单没有保证。关于设备投标,我想这就是为什么它在某些机器(例如mac)上有效,而在其他机器(例如ubuntu)上无效的原因。你知道我如何在没有外部路由(例如iptables/ip路由)的情况下绑定到特定的设备/nic吗?有一些像wget这样的程序(
--bind address
)和cURL(
--interface
)这可以做到这一点,但我不确定它们在内部是如何工作的。最初的问题是如何使用特定的网络接口拨号。在Linux上,您可以使用
syscall.BindToDevice
,但这是一种特权呼叫,通常不是正确的解决方案。如果curl可用,这可能就是curl所做的。首先找出它在网络上失败的原因级别(您的名称解析是否失败?)。如果问题只是目标与另一个接口的默认网关匹配,则需要添加路由来修复它。相关: