首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的端口转发允许套接字连接

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

Stack Overflow用户
提问于 2016-03-21 12:19:08
回答 3查看 3.5K关注 0票数 7

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

代码语言:javascript
复制
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。

代码语言:javascript
复制
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

它会打开一个端口,如下图所示。但是第一张图片中显示的端口转发列表是空的。它无法工作,客户端无法连接。我该如何解决这个问题呢?我遗漏了什么?

EN

回答 3

Stack Overflow用户

发布于 2016-04-02 17:47:53

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

如果需要,如果您想要动态获取服务器本地IP,请查看Finding local IP addresses using Python's stdlib

票数 4
EN

Stack Overflow用户

发布于 2016-04-04 15:29:27

我认为我们缺少了很多相关信息来了解这里的主要问题是什么。我看到很多人都在猜测。

顺便说一下,我只是在编辑这行

result=upnp.addportmapping(port_no, 'TCP', upnp.lanaddr, port_no, 'testing', '') to

如果它能工作,result=upnp.addportmapping('7777', 'TCP', '192.168.1.8', '7777', 'testing', '')会告诉你的。从本地主机做端口测试它是虚拟的,你根本不在路由器下。

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

代码语言:javascript
复制
try:
    print "1" + 1
except Exception as e:
    print str(e) 

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

票数 0
EN

Stack Overflow用户

发布于 2016-03-28 19:28:52

这是一个有趣的问题。从我所能召唤到的我想

GUI显示添加了UPNP端口转发规则。所以最有可能是UPNPC配置有问题。我怀疑您是在路由器或类似平台上使用X-WRT或OpenWRT进行此操作的

我认为问题是你不能使用upnp来解决这个问题,或者因为一些奇怪的原因它不能工作。

我建议你试试这个库pytables

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

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

和快速解决方案

尝尝这个

代码语言:javascript
复制
 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
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36123075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档