【问题标题】:How to connect a socket to another computer's socket through Internet如何通过 Internet 将套接字连接到另一台计算机的套接字
【发布时间】:2016-09-22 06:02:55
【问题描述】:

我最近通过互联网将一个socket连接到另一台计算机的socket上有些困难,一张图值一千字:

计算机 A 正在运行这个“listener.py”脚本:

import socket
PORT = 50007              
BUFFER = 2048              
HOST = ''  

if __name__ == '__main__':
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen(1)
        conn, addr = s.accept()
        with conn:
            print('Connected by', addr)
            while True:
                data = conn.recv(BUFFER)
                if not data: break
                conn.sendall(data)

计算机 B 正在运行这个“sender.py”脚本:

import socket
HOST = '101.81.83.169'    # The remote host
PORT = 50007              # The same port as used by the server


if __name__ == '__main__':
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        s.sendall(b'Hello, world')

首先,我运行计算机 A 的“listener”脚本。然后,我运行计算机 B 的“sender”脚本。但是,当我执行“sender”脚本时,我收到了一个错误消息解释我无权连接到此远程地址。

所以我想知道如何在不更改路由器配置的情况下通过互联网将一个套接字连接到另一个套接字。

非常感谢您的帮助。

编辑:这里是错误消息(由于某些原因我没有执行相同的脚本,但它是相同的错误消息)

sock.connect(('101.81.83.169',50007)) Traceback (most recent call last):   File "<stdin>", line 1, in
 <module>   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 224, in
meth     return getattr(self._sock,name)(*args) socket.error: [Errno 61] Connection refused

【问题讨论】:

  • sender.py 中看到了什么错误信息?
  • '我收到一条错误消息,向我解释我无权连接到此远程地址'。不,你没有。您收到一条错误消息。不要解释、解释、修改。告诉我们exact, actual 错误信息。 我们会告诉这意味着什么。在这种情况下,“连接被拒绝”只有一个含义:在您指定的 IP:端口上没有任何内容正在监听。与授权无关。
  • @EJP:“连接被拒绝”并不总是意味着端口没有在监听(在这种情况下,确实如此)。这也可能意味着端口正在侦听,但其待处理连接的积压目前已满。这也可能意味着中间防火墙在连接到达侦听端口之前已经阻止了连接。 “连接被拒绝”只是意味着 - 连接被拒绝,但客户端不会知道它被拒绝的原因。
  • @RemyLebeau 这总是意味着除了一个特定品牌的路由器/防火墙在大约 2000年发货之前,在人们意识到泄露负面信息仍然是一种信息之前泄漏。
  • @EJP:“连接被拒绝”并不总是意味着防火墙阻塞。正如我之前所说,当“端口正在侦听,但其待处理连接的积压此时已满”时也会发生这种情况。这与端口根本未打开以进行侦听时使用的操作系统响应相同。同样,客户端不知道连接被拒绝的原因,可能有几个不同的原因。

标签: python sockets networking


【解决方案1】:

所以我想知道如何在不更改路由器配置的情况下通过互联网将一个套接字连接到另一个套接字。

你不能。公共 IP 地址属于您的路由器。您的服务器没有在路由器中监听,而是在路由器后面的某个主机中监听。您必须在路由器中打开该端口并将其转发到您的侦听器正在运行的主机:无论这在您的特定路由器中意味着什么。否则路由器将拒绝连接,因为它没有在该端口监听任何东西。

【讨论】:

  • 如果路由器支持uPNP,监听器可以动态打开路由器上的端口,并将传入的连接转发给自己。否则,路由器管理员必须手动配置路由器的端口转发。
【解决方案2】:

计算机 B 无法直接连接到计算机 A,因为它的 IP 地址无法从外部访问。您需要在 101.81.83.169 路由器中设置端口转发规则,将端口 50007 的传入连接请求重定向到 IP 地址 192.168.0.4。

但是,既然您说您正在寻求解决方案而不更改路由器配置,那么您需要一些不同的东西。

在这种情况下,您可以设置在公共 Internet 上运行的中间服务器,然后两台计算机都可以连接到该中间服务器,并充当它们之间的中间隧道平台。解决方案已经存在,例如查看ngrok,它提供了 Python 绑定。

【讨论】:

  • 他没有尝试连接到系统 B。他正在尝试通过系统 A 的公共 IP 地址连接到系统 A。阅读问题。
  • @EJP - 没关系,两个系统的可访问性是相同的。而系统A没有公网IP地址,系统A使用的默认网关路由器有公网IP地址。 B 也一样。我的答案仍然有效。
  • 您的回答以“您无法直接连接到系统 B”开头,这与所提出的问题无关。你总是可以解决它。
【解决方案3】:

"Computer Networking: A Top-Down Approach"一书中,第149页有一段非常有趣的关于Bittorents是如何工作的:

每个种子都有一个称为跟踪器的基础设施节点。当一个节点加入一个 torrent 时,它会向跟踪器注册自己并定期通知跟踪器它仍然在 torrent 中。以这种方式,跟踪器跟踪参与 torrent 的对等点。一个给定的洪流在任何时刻可能有少于十个或多于一千个对等方参与。 Alice,加入洪流,跟踪器从参与的对等点集合中随机选择一个对等点子集(具体来说,例如 50 个),并发送这 50 个点的 IP 地址与爱丽丝同行。拥有该对等点列表后,Alice 尝试与该列表中的所有对等点建立并发 TCP 连接。让我们将所有与 Alice 成功建立 TCP 连接的节点称为“邻居节点”。

所以:

- 步骤 1:Alice 连接到跟踪器,跟踪器将 Bob 和 Mick 的 IP 地址提供给 Alice。

- 第二步:Alice 收到 Bob 和 Mick 的 ip 地址,然后她可以尝试建立 TCP/IP 连接来下载文件。

当我想从 Bittorent 下载文件时,我不记得必须设置任何路由器配置。

那么我错过了什么?

【讨论】:

猜你喜欢
  • 2013-08-03
  • 2015-08-23
  • 1970-01-01
  • 2017-07-15
  • 2021-08-04
  • 2015-05-17
  • 2013-02-10
  • 2018-06-16
  • 1970-01-01
相关资源
最近更新 更多