2014-12-10 12 views
7

Ich habe zwei Netzwerkschnittstellen auf meinem Computer (eth0 und eth1) und ich versuche, eine Verbindung mit einem bestimmten (eth1) zu wählen. Angesichts der Aussage, dass Go eine Systemsprache ist, nahm ich das an, aber ist das mit der aktuellen Standardbibliothek wirklich möglich?Wählen mit einer bestimmten Adresse/Schnittstelle? Golang

Bisher habe ich bekam InterfaceByName die Schnittstelle von Namen zu bekommen (eth1), dann reichen ich über die Addrs Verfahren und extrahiert die erste Adresse [0], die die Quelladresse von eth1 Schnittstelle zu sein scheint (zB xxx.xxx .xxx/24); der andere ist die IPv6-Adresse.
Ich habe eine neue Dialer erstellt und Dialer.LocalAddr mit der Adresse extrahiert. Ich erhalte jedoch diesen Fehler mismatched local address type wich auf dialSingle Funktion von dial.go

bearbeiten einige Code im Zusammenhang scheint:

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

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

+0

behaupten ich Probleme reproduzieren diese habe - können Sie zeigen ein Beispiel dafür, wie bist du die Adresse bekommen und die Schaffung der Dialer ? – JimB

+0

@ JimB danke für den Blick darauf. Ich habe einen Code geschrieben. Es scheint, dass ich den Fehler unabhängig von der Adresse/Schnittstelle erhalte, die ich benutze, also kann ich nur annehmen, dass die Adresse, die ich in der "Dialer.LocalAddr" zur Verfügung stellte, nicht von der Form ist, die sie erwartet, kompiliert. Ich habe untersucht und es scheint, dass der von Go zugewiesene Standardtyp die gleiche IP-Adresse (die src der Schnittstelle) aber auch eine Portnummer hat. Ich bin mir nicht sicher, warum der Port benötigt wird und wie ich es bekommen kann. –

+0

Verwenden Sie Port: 0, es ist wahrscheinlich Teil der Spezifikation, da einige Protokolle einen bestimmten Quellport haben möchten, also brauchten sie einen Weg, um sie spezifizieren zu lassen. : 0 ist der ephemere "zufällige" (unbenutzte) Port –

Antwort

11

Wenn Sie die Adresse von einer Schnittstelle zu ziehen, es ist vom Typ *net.IPnet in einer net.Addr Schnittstelle verpackt, die Adresse und Netzmaske enthält keine Adresse und Port. Sie können die IP-Adresse verwenden jedoch eine neue TCPAddr zu erstellen, nachdem es als *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

vielen dank! Ich bin mir nicht sicher, warum ich dich nicht früher gesehen habe ... irgendwie bin ich auch mit einem TCPAddr gelandet. Das Problem ist jedoch, dass der Dialer nicht funktioniert, es sei denn, die verwendete Schnittstelle ist die Standardschnittstelle. Irgendeine Idee, wenn das ein Go-Bug oder ein Kernel-Problem ist? Voreingestellt meine ich die, die als Standard über dev .... bereitgestellt wird, wenn ich 'ip route show' starte –

+0

vergesst es scheint, dass es ein Treiberproblem ist. Auf einigen Maschinen funktioniert (d. H. Auf meinem Mac) auf anderen Maschinen nicht (d. H. Auf meinem Server). –

+0

Denken Sie daran, dass die Reihenfolge der Adressen nicht garantiert ist. Sie müssen daher prüfen, ob Sie IPv4 oder IPv6 verwenden. Beachten Sie außerdem, dass die Bindung an eine IP * Sie nicht an ein bestimmtes Gerät bindet. Das abgehende Gerät wird zur Routing-Zeit festgelegt, und der Datenverkehr kann blockiert werden, weil das Netzwerk nicht übereinstimmt oder Einschränkungen wie die Überprüfung des umgekehrten Pfads bestehen. – JimB

Verwandte Themen