2013-01-23 120 views
9

我正在製作一個Python應用程序,要求用戶將端口轉發到他的計算機以便與服務器或其他用戶進行通信。目前的實現工作非常好,但唯一的是運行該文件的人必須手動將端口轉發到本地IP。我想自動化這一點。他挑選一個端口,腳本檢查它是否可以被轉發,然後轉發它。如果不能,則分別處理錯誤。通過Python中的UPnP轉發端口

我查看了一些聲稱他們可以在純Python中執行此操作的庫(因爲完成後我需要編譯爲.exe),但沒有設法找到有用的東西。如果你可以給我一個關於如何嘗試轉發一個端口並分別處理成功/失敗的代碼示例,那就太好了。

提前感謝您的時間。

PS:這是我針對

+0

P.S:該應用程序將在Mac上進行開發,後來在Windows機器上進行測試。如果有效,它將被編譯並部署到所有平臺。 – DaKnOb

+0

我正在尋找同樣的事情,不幸的是我發現只有[Brisa](http://stackoverflow.com/q/4742001/897968)和[MiniUPNP](http://stackoverflow.com/a/10440556/897968)到目前爲止......肯定必須有一個更新的/緊湊的/純粹的Python實現?任何人? – FriendFX

+0

在此尋找跨平臺解決方案。 –

回答

0

的Python 2.7.X貌似有幾個選項:

pytho有個很好的例子n用於GNUPnP的綁定,用於打開路由器here上的端口。 在該例中,租約時間設置爲0,這是無限的。有關add_port的定義,請參見here

一個簡單的例子可能是:

#! /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()