Python: Holen Sie sich die lokale IP-Adresse zum senden von IP-Daten an eine bestimmte remote IP-Adresse

Bin ich mit einem Python-Skript zum senden von UDP-Paketen an einen server von registrieren mein script zum empfangen von Benachrichtigungen vom server. Das Protokoll verlangt, dass ich meine eigene IP-Adresse und port, auf dem ich empfangen möchten, diese Meldungen, so sollte dies eine Adresse sein, die vom server aus erreichbar ist Netzwerk.

Lösungen sollten zumindest die Arbeit auf Windows XP und höher und vorzugsweise Mac OS X, dies ist mein Entwicklungs-Plattform.

Der erste Schritt ist, um die IP-Adresse meiner Schnittstellen. Ich bin derzeit mit die häufigsten vorgeschlagene Ansatz zur Lösung des Maschinen eigenen host-Namen:

def get_local_address():
    return socket.gethostbyname(socket.gethostname())

Dies funktioniert nur manchmal. Derzeit gibt es 172.16.249.1, das ist die Adresse der virtuellen Schnittstelle verwendet, die durch VM-Ware, so ist dies ein problem.

Viel besser wäre ein Weg, um die IP-Adresse des Standard-Schnittstelle, die sollten die richtigen sein, die meisten der Zeit.

Noch besser wäre ein Weg, um die tatsächliche IP-Adresse verwendet, um die Verbindung zum server durch einen verbindungsorientierten Protokolls wie TCP. Ich kann wirklich erhalten Sie die Adresse, nicht aber, ohne beim öffnen der Verbindung:

def get_address_to_connect_to(server_addr):
    non_open_port = 50000
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    try:
        s.connect((server_addr, non_open_port))
    except socket.error:
        pass
    else:
        s.close() # just in case

    return s.getsockname()[0]

Diese blockieren, bis einige TCP-timeout wurde erreicht in dem Fall, dass der server nicht erreichbar ist oder eine böse firewall dazwischen ist die Blockierung von ICMP-Paketen. Gibt es einen besseren Weg, um diese Informationen zu erhalten?

InformationsquelleAutor Feuermurmel | 2011-09-07
Schreibe einen Kommentar