【发布时间】:2016-07-07 11:48:10
【问题描述】:
我使用套接字启动服务器并希望允许客户端连接到它。
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
它会打开一个如下图所示的端口。但是第一张图片中显示的端口转发列表是空的。它不起作用,客户端无法连接。我怎样才能解决这个问题?我错过了什么?
【问题讨论】:
-
本地可以连接吗?
-
@BrianCain 是的,在同一台机器上使用 127.0.0.1。
-
我认为“第一张图片中的端口转发列表”只显示了手动映射。
-
至于为什么客户端无法连接,现在由您来诊断:检查网络问题的要点(如果外部端口未打开,则无法在任一方向正确转发数据包,等等。)。如果您的路由器确实是根本原因,那么在 SO 上处理它是题外话。根据stackoverflow.com/questions/4391872/… 的示例,您的程序看起来不错。
-
Upnp 不允许 DHCP 地址,需要路由器上的静态 IP。监听端口是 4000 和 35716 是出端口。您的模块或 UPNP 使用了外部端口(可能是 1900),需要重定向端口以确保安全(保护您的其他本地设备)。不要使用具有默认端口的设备(在 LAN 上)。
标签: python sockets networking