Ethernet Controller bei Sockets auswählen

Status
Nicht offen für weitere Antworten.

Tikonteroga

Erfahrenes Mitglied
Hallo,

wenn ich mit der Winsock2.h von einem Client aus eine Verbindung zu einem Server herstellen möchte und ich habe auf dem Client z. B. zwei Ethernet Controller, wie kann ich dann den Controller auswählen, für den ich einen Socket bzw. über den ich eine Verbindung herstellen möchte.

MfG
 
Ich verstehe nicht inwiefern das die Frage beantworten sollte.

Wenn man sich mit einem entfernten Computer verbindet, muss man dessen IP Adresse als Ziel angeben.

Welches NIC für diese Verbindung verwendet wird, hängt von den Einträgen in der Routing Tabelle des Betriebssystems ab und kann (wahrscheinlich) nicht über winsock2 Funktionen geändert werden.
 
bind().

http://stackoverflow.com/questions/1237679/perform-connect-on-specific-network-adapter

Auch wenn ich es nicht testen kann, sauge ich mir nicht alles aus den Fingern...
http://support.microsoft.com/kb/175396

If the program specifies a source IP address to use in the bind() call, that IP address is used as the source IP address for TCP connections or UDP datagrams sourced from that socket. However, the route table is still used to route the outbound IP datagrams, based on the target IP address. As a result of this behavior, the source IP address may not be the one associated with the network adapter that is chosen to send the packets.
 
Soweit ich das verstehe, steht da, dass die Source-Adresse nicht dieselbe wie die des ausgewählten Adapters sein muss. Der gewählte Netzwerkadapter wird dennoch genutzt.
http://tangentsoft.net/wskfaq/advanced.html
Punkt 4.10:
The other reason is that you have two or more possible outgoing routes, and you want your client program to connect using a particular one without the routing layer getting in the way.

You can do both of these things with the bind() function. Using one of the “get my IP addresses” examples, you can present your user with a list of possible addresses. Then they can pick the appropriate address to use, which your program will use in the bind() call. Obviously, this is only feasible for programs intended for advanced users.
Auch ich habe Quellen. Warum willst du eigentlich so unbedingt, dass das nicht geht?

Gruss
cwriter
 
Soweit ich das verstehe, steht da, dass die Source-Adresse nicht dieselbe wie die des ausgewählten Adapters sein muss. Der gewählte Netzwerkadapter wird dennoch genutzt.
Nein. Da steht das der Adapter vom Routing Layer ausgewählt wird, ganz gleich welche lokale Adresse mittels bind() angegeben wurde.
Ich gehe davon aus, dass ein KB Artikel von Microsoft normativer / verläßlicher ist als eine FAQ eines Dritten.
Warum willst du eigentlich so unbedingt, dass das nicht geht?
Wie kommst du darauf? Du scheinst nur die Tatsachen ignorieren zu wollen:

Du hast nur in deinem 1. Beitrag überhaupt keine Lösung geliefert.

In deinem 2. Beitrag hast du wenigstens einen Ansatz genannt. Dieser wird aber im Allgemeinen nicht funktionieren. Eine Internetsuche fördert unzählige Forumsbeiträge von Leuten zutage die genau dieses Problem haben - und wo bind() nicht funktioniert.

Ab Windows Vista könnte(!) es funktionieren, falls das weakhostsend Verhalten für die entsprechenden NICs abgeschaltet ist.
 
Ich gehe davon aus, dass ein KB Artikel von Microsoft normativer / verläßlicher ist als eine FAQ eines Dritten.
Stimmt:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms737550(v=vs.85).aspx
The bind function is not normally required for send operations to a multicast group. The sendto,WSASendMsg, and WSASendTo functions implicitly bind the socket to the wildcard address if the socket is not already bound. The bind function is required before the use of the send or WSASend functions which do not perform an implicit bind and are allowed only on connected sockets, which means the socket must have already been bound for it to be connected. The bind function might be used before send operations using the sendto,WSASendMsg, or WSASendTo functions if an application wanted to select a specific local IP address on a local computer with multiple network interfaces and local IP addresses. Otherwise an implicit bind to the wildcard address using the sendto,WSASendMsg , or WSASendTo functions might result in a different local IP address being used for send operations.

Du hast nur in deinem 1. Beitrag überhaupt keine Lösung geliefert.
Stimmt. Wo habe ich das bestritten? Und vor allem: Wo hast du eine Lösung geliefert?
In deinem 2. Beitrag hast du wenigstens einen Ansatz genannt. Dieser wird aber im Allgemeinen nicht funktionieren. Eine Internetsuche fördert unzählige Forumsbeiträge von Leuten zutage die genau dieses Problem haben - und wo bind() nicht funktioniert.
Mag ja sein. Aber kritisieren ist nur eine Seite. Nun bin ich gespannt, wie du das machen würdest.

Gruss
cwriter
 
Hallo cwriter

Ich verstehe dein Problem nicht wirklich genau. Hätte deepthroat einfach nichts schreiben sollen, obwohl er sich sicher ist, dass es nicht funktioniert? Ist es nicht Sinn eines Forums genau darüber zu diskutieren, wie man zum Ziel kommt?

Viele Grüsse
Cromon
 
@Cromon
Ist es nicht Sinn eines Forums genau darüber zu diskutieren, wie man zum Ziel kommt?
Doch, natürlich. Aber die einzige gegebene, wenn auch nicht immer funktionierende Möglichkeit runterzuputzen, ohne einen anderen Weg zu bieten, ist nicht konstruktiv und nutzt dem TE, der das Thema übrigens als erledigt markiert hat, genau gar nichts.

Ich mache Fehler, und das bestreite ich nicht. Wenn aber der Fehler noch nicht zu 100% bestätigt ist, z.B. es eine zwar unzuverlässige Lösung, aber die einzige Lösung überhaupt ist, dann kann ich nicht sagen, dass eine andere Lösung besser ist.
Gerade in diesem Fall ist das Betriebssystem der Dreh- und Angelpunkt. Wenn man die Einstellung zuerst ändern, dann neustarten, das Programm ausführen und dann alles rückgängig machen muss, dann wäre mir die unzuverlässige Methode ganz klar lieber.

Ich bin Kritik nicht abgeneigt, und mag Diskussionen über den "besten" Weg, aber was ich nicht mag, ist destruktive Kritik, die keine Lösung bietet, sondern sogar den letzten Funken Hoffnung zerstört. Die Wissenschaft ist der heutige Stand des Irrtums. Würde ich sagen, dass das 2. Newton'sche Axiom nicht immer stimmt, und sogar beweisen könnte, dass die Abweichung 10^(-100000000000) beträgt, ohne eine Alternative zu bieten, würde man notgedrungen auch bei der alten Definition bleiben.
Wenn jemand eine konkurrenzfähige Lösung hat, herzlich willkommen, aber wenn nicht, kann man zwar Bedenken äussern, aber trotz allem nützt das der Zielfindung gar nichts.

Gruss
cwriter
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Zurück