2014-12-10 20 views
7

Ho due interfacce di rete sul mio computer (eth0 ed eth1) e sto provando a comporre una connessione usando uno specifico (eth1). Data la dichiarazione che Go è un linguaggio di sistema, l'ho assunto ma è davvero possibile con la libreria standard corrente?Componi con un indirizzo/interfaccia specifico? Golang

Finora ho avuto modo di ottenere l'interfaccia in base al nome InterfaceByName (eth1) poi ho gamma rispetto al metodo Addrs ed estratto il primo indirizzo [0], che sembra essere l'indirizzo di origine dell'interfaccia eth1 (ad es xxx.xxx .xxx/24); l'altro è l'indirizzo ipv6.
Ho creato un nuovo Dialer e impostato Dialer.LocalAddr con l'indirizzo estratto. Tuttavia ottengo questo errore mismatched local address type Quale sembra essere correlata alla funzione dialSingle da dial.go

Modifica Alcuni codice:

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

uscita: 2014/12/10 17:11:48 dial tcp 216.58.208.32:80: mismatched local address type ip+net

+0

Ho problemi a riprodurre questo - è possibile mostrare un esempio di come si sta ottenendo l'indirizzo e la creazione del dialer ? – JimB

+0

@JIMB grazie per averlo esaminato. Ho pubblicato del codice. Sembra che ottenga l'errore indipendentemente dall'indirizzo/interfaccia che sto usando, quindi posso solo supporre che l'indirizzo che ho fornito nel '' Dialer.LocalAddr'' non sia il modulo che si aspetta attraverso la compilazione. Ho studiato e sembra che il tipo predefinito assegnato da Go abbia lo stesso indirizzo IP (lo src dell'interfaccia) ma anche un numero di porta. Non sono sicuro del motivo per cui la porta è richiesta e come posso ottenerla/assegnarla. –

+0

usa la porta: 0, probabilmente è parte della specifica in quanto alcuni protocolli potrebbero volere una specifica porta sorgente, quindi avevano bisogno di un modo per permetterti di specificare. : 0 è l'effimera porta "casuale" (non utilizzata) –

risposta

11

Quando si tira l'indirizzo da un'interfaccia, è di tipo *net.IPnet avvolto in un'interfaccia net.Addr, che contiene e indirizzo e maschera di rete non un indirizzo e una porta. È possibile utilizzare l'indirizzo IP invece di creare un nuovo TCPAddr dopo aver affermato come un *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, 
    } 
+0

grazie mille! Non sono sicuro del motivo per cui non ti ho visto rispondere prima ... in qualche modo sono finito con un TCPAddr. Tuttavia, il problema è che il dialer non funziona a meno che l'interfaccia utilizzata sia quella predefinita. Qualche idea se si tratta di un bug di Go o di un problema del kernel? Predefinito Intendo quello che viene fornito come predefinito via dev .... quando eseguo 'ip route show' –

+0

sembra che sia un problema di driver. Su alcune macchine funziona (ad esempio sul mio Mac) su altre macchine non funziona (cioè sul mio server). –

+0

Ricorda che l'ordine degli indirizzi non è garantito, quindi devi verificare se stai usando IPv4 o IPv6. Inoltre, tieni presente che il collegamento a un IP * non * ti lega a un dispositivo specifico. Il dispositivo in uscita viene determinato al momento del routing e il traffico può essere bloccato perché la rete non corrisponde o esistono restrizioni come il controllo del percorso inverso. – JimB