【问题标题】:Python network programming(bind to external address)Python网络编程(绑定外部地址)
【发布时间】:2012-05-22 15:46:44
【问题描述】:

我是 python 的新手,几天前我开始尝试网络编程(我也是那里的新手)

现在我发现了一个简洁的客户端服务器程序,它在我的计算机上运行非常简单,但是当我替换本地地址并告诉我的朋友运行客户端脚本时,它就是没有响应。

我的全球IP地址:120.59.XX.XXX

ipconfig 返回的我的 IPv4 地址:192.168.1.2(我通过路由器连接到互联网)

我的网关地址:192.168.1.1

使用的端口:1060(我在本地测试了这个端口,它没有被使用)

#server.py

import socket
import sys

server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

MAX = 65535
PORT = 1060

server.bind(('192.168.1.2', PORT))
print 'Listening at', server.getsockname()
while True:
    data, address = server.recvfrom(MAX)
    print 'The client at', address, 'says', repr(data)
    server.sendto('Your data was %d bytes' % len(data), address)

客户代码:

#client.py

import socket
import sys

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

PORT = 1060
MAX = 65536

client.sendto('Hello Server!', ('120.59.XX.XXX', PORT))
data, address = client.recvfrom(MAX)
print 'The server', address, 'says', repr(data)

我在我的电脑上启动 server.py 并告诉我的朋友启动 client.py,我允许通过防火墙到 python 的传入连接,我还将 1060 端口添加到 windows 传入连接列表。

仍然没有响应,我无法解释原因(我有一个动态 IP 地址,但对于当前会话,它保持不变,因此应该可以工作,1060 也是一个众所周知的端口,不应该是问题对吧?)

【问题讨论】:

    标签: python networking


    【解决方案1】:

    您需要在路由器中添加端口转发规则!类似于从端口 1060 转发到 192.168.1.2 端口 1060。

    【讨论】:

    • 是的,这是我最初的想法,但是为什么 utorrent 能够在没有我转发的情况下使用端口?而且众所周知,1060 被 SAP 使用
    • 它连接到某处的服务器,即 TCP 连接是从您的 PC 启动的。
    • NAT 技术通常很智能。如果连接是由本地网络中的机器发起的,大多数 NAT 实现会将响应映射回这台机器。如果连接是从外部发起的,它会出乎意料地出现(从“路由器”的角度来看)。如果没有指定如何处理这种意外连接的规则(如端口转发规则),路由器将拒绝该连接。
    • 所以如果我可以欺骗路由器,我的意思是通过 UDP 向任何 URL 发送随机(或空)消息,获取我的随机端口号(操作系统将分配),然后将我的服务器绑定到那个端口号。它会工作吗?
    【解决方案2】:

    您需要路由器上的port-forward,它将连接到路由器外部(全局)地址的端口 1060 转发到您的桌面 IP 192.168.1.2 端口 1060。

    【讨论】:

    • 好的,但是如果我使用一个众所周知的端口,它应该工作吗?因为我使用了 80(我知道我不应该),它仍然没有工作。
    • 众所周知的端口,如 80 和 25,在传入时经常被 ISP 阻止。使用 42424 之类的随机高数端口。
    • 我将 1060 转发到我本地 IP 的 192.168.1.2,它仍然无法正常工作。
    • 路由器可能会在您进行端口转发时采用 TCP。看看那里是否有启用 UDP 的选项,您正在尝试这样做。
    • 另外两件事要检查 - windows pc 上的本地防火墙是否允许 udp:1060 进入,如果你在那个路由器上有任何日志记录功能,看看你是否真的从你的朋友那里得到了这些数据包(他们可能会在其他地方被过滤/丢弃)。
    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 2016-10-28
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2019-06-29
    相关资源
    最近更新 更多