2013-01-23 8 views
9

Ich mache eine Python-Anwendung, die erfordert, dass der Benutzer einen Port an seinen Computer weitergeleitet bekommt, um mit einem Server oder einem anderen Benutzer zu kommunizieren. Die aktuelle Implementierung funktioniert ziemlich gut, aber die Person, die die Datei ausführt, muss den Port manuell an die lokale IP-Adresse weiterleiten. Ich möchte das automatisieren. Er wählt einen Port aus, Skript prüft, ob es weitergeleitet werden kann, und leitet es weiter. Wenn es nicht möglich ist, behandelt es den Fehler jeweils.Einen Port über UPnP in Python weiterleiten

Ich habe einige Bibliotheken untersucht, die behaupten, dass sie das in reinem Python machen können (da ich nach dem Beenden [...] nach .exe kompilieren muss), habe aber nichts Nützliches gefunden. Wenn Sie mir ein Codebeispiel zur Verfügung stellen könnten, wie Sie versuchen, einen Port weiterzuleiten und mit Erfolg/Misserfolg umzugehen, wäre das großartig.

Vielen Dank im Voraus für Ihre Zeit.

PS: Es ist Python 2.7.x, die ich

+0

P. S .: Die App wird auf einem Mac und später getestet auf einem Windows-Rechner entwickelt werden. Wenn es funktioniert, wird es auf allen Plattformen kompiliert und bereitgestellt. – DaKnOb

+0

Ich schaute in die gleiche Sache, leider fand ich nur [Brisa] (http://stackoverflow.com/q/4742001/897968) und [MiniUPNP] (http://stackoverflow.com/a/10440556/897968) bisher ... muss es sicherlich eine aktuellere/kompakter/reine Python-Implementierung geben? Jemand? – FriendFX

+0

Auf der Suche nach Cross-Plattform-Lösung hier. –

Antwort

0

bin Targeting Sieht aus wie es ein paar Optionen sind:

Es gibt ein schönes Beispiel des Pytho n Bindungen für GNUPnP werden verwendet, um Ports auf einem Router zu öffnen here. In diesem Beispiel wird die Lease-Zeit auf 0 gesetzt, was unbegrenzt ist. Siehe here für die Definition von add_port.

könnte ein einfaches Beispiel sein:

#! /usr/bin/python 
import gupnp.igd 
import glib 
from sys import stderr 

my_ip = YOUR_IP 

igd = gupnp.igd.Simple() 
igd.external_ip = None 

main = glib.MainLoop() 

def mep(igd, proto, eip, erip, port, localip, lport, msg): 
    if port == 80: 
     igd.external_ip = eip 
     main.quit() 

def emp(igd, err, proto, ep, lip, lp, msg): 
    print >> stderr, "ERR" 
    print >> stderr, err, proto, ep, lip, lp, msg 
    main.quit() 

igd.connect("mapped-external-port", mep) 
igd.connect("error-mapping-port", emp) 

#igd.add_port("PROTO", EXTERNAL_PORT, INTERNAL_IP, INTERNAL_PORT, LEASE_DURATION_IN_SECONDS, "NAME") 
igd.add_port("TCP", 80, my_ip, 8080, 86400, "web") 

main.run()