一尘不染

用特定的地址/接口拨号?高朗

go

我的计算机上有两个网络接口(eth0和eth1),并且我正在尝试使用特定的接口(eth1)拨号连接。考虑到我假设Go是一种系统语言,但是当前的标准库是否真的有可能?

到目前为止,我必须通过名称InterfaceByNameeth1)获取接口,然后遍历该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


阅读 235

收藏
2020-07-02

共1个答案

一尘不染

当您从接口提取地址时,它的类型就是*net.IPnet包装在net.Addr接口中的接口,该接口包含和地址和网络掩码,而不是地址和端口。您可以将IP地址声明为一个IP地址,然后使用它来创建一个新的TCPAddr。*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,
    }
2020-07-02