我使用套接字启动服务器,并希望允许客户端连接到它。
self.sock.bind(('0.0.0.0',0)) # 0.0.0.0 will allow all connections and port 0 -> os chooses a open port.
stroke_port=self.sock.getsockname()[1]
self.sock.listen(75)
self.open_port_popup(stroke_port)
我想以自动化方式做到这一点。 - >我试着upnp。
import miniupnpc
def open_port(port_no):
'''this function opens a port using upnp'''
upnp = miniupnpc.UPnP()
upnp.discoverdelay = 10
upnp.discover()
upnp.selectigd()
# addportmapping(external-port, protocol, internal-host, internal-port, description, remote-host)
result=upnp.addportmapping(port_no, 'TCP', upnp.lanaddr, port_no, 'testing', '')
return result
打开下图所示的端口。但第一张图片中显示的端口转发列表为空。它不起作用,客户端无法连接。我怎样才能解决这个问题?我错过了什么?
答案 0 :(得分:4)
我认为您使用upnp.lanaddr
作为内部主机地址时犯了一个错误。 upnp.lanaddr
是upnp设备的地址,它是您的路由器,您想要使用服务器的本地地址。
如果您想要动态获取服务器本地IP,请查看Finding local IP addresses using Python's stdlib。
答案 1 :(得分:0)
我认为我们缺少很多相关信息,以了解这里的主要问题。我看到很多人在猜测。
顺便说一句,只需编辑该行
result=upnp.addportmapping(port_no, 'TCP', upnp.lanaddr, port_no, 'testing', '')
到
result=upnp.addportmapping('7777', 'TCP', '192.168.1.8', '7777', 'testing', '')
会告诉你它是否有效。
从localhost进行端口测试它是假的,你根本就不在路由器下面。
另外,请记住使用Try / Except块告诉您代码有什么问题。
try:
print "1" + 1
except Exception as e:
print str(e)
另一种方式,非流行的是使用html / web自动化,甚至cURL使用uPnp来代替这些请求,这样你就不需要处理它了。
答案 2 :(得分:-3)
GUI显示添加了UPNP端口转发规则。 所以很可能在UPNPC配置中存在问题。 我怀疑你是在使用X-WRT或OpenWRT
的路由器或类似平台上这样做的我认为这个问题是你不能使用upnp,或者由于一些奇怪的原因它不起作用。
我建议你试试这个图书馆pytables。
我知道你想知道为什么,我正在努力弄清楚原因。
这只是为了让你开始这个项目
并提供快速解决方案
试试这个
import subprocess
p = subprocess.Popen(["iptables", "-A", "INPUT", "-p", "tcp", "-m", "tcp", "--dport", "22" , "-j", "ACCEPT"], stdout=subprocess.PIPE)
output , err = p.communicate()
print output