python中允许套接字连接的端口转发

python中允许套接字连接的端口转发,python,sockets,networking,Python,Sockets,Networking,我使用套接字启动服务器,并希望允许客户端连接到它 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) 现在,对于其他连接的客户端,我已经手动将其端

我使用套接字启动服务器,并希望允许客户端连接到它

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
它会打开下图所示的端口。但是第一个图像中显示的端口转发列表为空。它不工作,客户端无法连接。我怎样才能解决这个问题?我错过了什么?
这是一个有趣的问题。 我想从我能召唤到的

GUI显示添加了UPNP端口转发规则。 因此,UPNPC配置中很可能存在问题。 我怀疑你们是在路由器或类似的平台上用X-WRT或OpenWRT做这件事的

我认为问题是你不能使用upnp来实现这一点,或者因为一些奇怪的原因它不起作用

我建议你试试这个图书馆

我知道你想知道为什么,我正在努力找出原因

这只是为了让你开始这个项目

和快速解决方案

试试这个

 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

我认为您使用
upnp.lanaddr
作为内部主机地址是一个错误
upnp。lanaddr
是作为路由器的upnp设备的地址,您希望使用服务器的本地地址


如果需要,请查看是否要动态获取服务器本地IP。

我认为我们缺少很多相关信息,无法了解这里的主要问题。我看到很多人在猜测

顺便说一下,只是编辑那行

result=upnp.addportmapping(端口号,'TCP',upnp.lanaddr,端口号,'testing','')

result=upnp.addportmapping('7777','TCP','192.168.1.8','7777','testing','')将告诉您它是否有效。
在本地主机上进行端口测试是虚拟的,根本不在路由器下

此外,请记住使用Try/Except块来告诉您代码中的错误

try:
    print "1" + 1
except Exception as e:
    print str(e) 

另一种不流行的方法是使用html/web自动化,甚至使用cURL来发出这些请求,而不是使用uPnp,这样你就不需要处理它了。

你能在本地连接吗?@BrianCain是的,在同一台机器上使用127.0.0.1。我认为“第一个映像中的端口转发列表”只显示手动映射。至于为什么客户端不能连接,现在由您来诊断这个问题:检查网络问题的要点(如果外部端口未打开,没有正确地向任何方向转发数据包,等等)。如果你的路由器确实是根本原因,那么处理它就不是话题了。根据示例,您的程序看起来不错。Upnp不允许DHCP地址,需要路由器上的静态IP。侦听端口为4000,35716为输出端口。您的模块或UPNP使用了外部端口(可能是1900),需要重定向端口以确保安全(保护您的其他本地设备)。不要使用带有默认端口的设备(在局域网上)。您好,这是我找到的现成代码
import subprocess p=subprocess.Popen([“iptables”、“-A”、“INPUT”、“-p”、“tcp”、“-m”、“tcp”、“-dport”、“22”、“-j”、“ACCEPT”]、stdout=subprocess.PIPE)输出,err=p.communicate()打印输出
请您的答案包括回答问题的代码或其他内容,而不是附加注释。@Devidas Hi,谢谢回答!我尝试了你的代码,它给了我这个错误:
>>p=subprocess.Popen([“iptables”、“-A”、“INPUT”、“-p”、“tcp”、“-m”、“tcp”、“--dport”、“22”、“-j”、“ACCEPT”]、stdout=subprocess.PIPE)
回溯(最近一次调用):文件“”,第1行,在文件“c:\Anaconda\lib\subprocess.py”中,第710行,在uu init\uuuu\errread中,errwrite)文件“c:\Anaconda\lib\subprocess.py”,第958行,在_execute\u child startupinfo)窗口错误:[错误2]系统找不到指定的文件
。如果我遗漏了什么,请告诉我。我想我提交的代码假设你有某种linux机器。还有一件事你没有指定平台,所以我很难回答。所以,请添加这些信息,并尝试pytables,但从错误中我发现这是windows机器,导致此错误的原因是windows上没有称为iptables的二进制文件。