在Python中通过UPnP转发端口
我正在制作一个Python应用程序,这个程序需要用户将一个端口转发到他们的电脑上,以便能够和服务器或其他用户进行通信。目前的实现效果很好,但唯一的问题是,运行这个程序的人必须手动将端口转发到本地IP。我想要自动化这个过程。用户选择一个端口,脚本检查这个端口是否可以转发,然后自动进行转发。如果不能转发,程序会相应地处理错误。
我查找了一些声称可以用纯Python实现这个功能的库(因为我需要在完成后编译成.exe文件[...]),但没有找到有用的东西。如果你能给我提供一个代码示例,教我如何尝试转发一个端口并处理成功或失败的情况,那就太好了。
提前感谢你的帮助。
附注:我使用的是Python 2.7.X
1 个回答
1
看起来有几个选择:
- Miniupnp 有 Python 绑定
- GNUPnP 的 Python 绑定
- miranda-upnp 是纯 Python 编写的
这里有一个很好的例子,展示了如何使用 GNUPnP 的 Python 绑定在路由器上打开端口,可以查看这里。在这个例子中,租用时间设置为 0,表示无限期。关于 add_port 的定义,可以查看 这里。
一个简单的例子可能是:
#! /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()