2008-12-02 6 views
19

Ich habe einen Server mit zwei verschiedenen Netzwerkschnittstellen, jede mit einer anderen IP-Adresse. Wie kann ich einen Socket erstellen, so dass es eine bestimmte IP-Adresse auslöst?Wie erstelle ich einen ausgehenden Socket zu einer bestimmten Netzwerkschnittstelle?

Ich würde ein Python-Beispiel bevorzugen, aber die Frage ist Sprache agnostisch, also weg schießen.

EDIT: Bitte geben Sie mir nicht "Sie können nicht" als Antwort. Ich meine, es ist ein Computer. Ich kann zum Beispiel alles tun, was ich möchte - ich kann die eine Schnittstelle, die ich nicht im laufenden Betrieb möchte, programmatisch deaktivieren. Ich suche etwas Hübscheres.

Antwort

12

Sie können einen Socket sicher an ein bestimmtes Gerät binden.

Ich weiß nicht, wie es in Python zu tun, aber mit der Berkeley-Buchse API (in C) müssen Sie setsockopt() anrufen, mit der Option SO_BINDTODEVICE.

Sie übergeben einen Interface-Deskriptor vom Typ struct ifreq. Idealerweise erhalten Sie den Inhalt des Schnittstellendeskriptors, indem Sie ioctl() verwenden und SIOCGIFINDEX anfordern - den Namen der Schnittstelle (z. B. eth0) als Argument übergeben.


edit: Nur eine schnelle Suche gemacht und this Dokumentation der Buchse Methoden in Python gefunden. setsockopt() ist unter ihnen.

+0

Vielen Dank! Ich werde es versuchen und melden. – Mikle

+0

Funktioniert nur für Linux. Was ist mit OS X? – Dor

11

Nur eine kleine Anmerkung - was ich wirklich brauchte ist an eine bestimmte IP zu binden, und nur der Vollständigkeit halber ist die Lösung, den Sockel nach der Erstellung zu binden. Quelle in Python:

import socket 
s = socket.socket() 
s.bind(("127.0.0.1", 0)) 
s.connect(("321.12.131.432", 80)) 
1
import socket 
s = socket.socket() 
s.bind((get_ip_address('eth0'), 0)) 

von Quora

+1

Dies funktioniert nicht ohne die Definition von get_ip_address – toth