2016-09-22 201 views
0

我最近有一些困难,通过互联网将套接字连接到另一台计算机的插座一个插口连接到另一台电脑的插座,图像胜过千言万语:如何通过互联网

enter image description here

计算机运行这个 “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) 

计算机运行这个 “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') 

所以首先,我运行计算机一个的 “听众” 脚本。然后,我运行计算机B的“发件人”脚本。但是,当我执行“发件人”脚本时,我收到一条错误消息,这说明我无权连接到此远程地址。

所以我想知道如何通过互联网连接套接字到另一个套接字而无需更改路由器配置。

非常感谢您的帮助。

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

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 
+0

中看到了什么错误讯息'sender.py'? – Prabhu

+0

'我收到一条错误消息,说明我无权连接到此远程地址。不,你不知道。您收到错误消息。不要解释,解释,破坏。告诉我们*确切*,*实际*错误消息。 *我们*会告诉你*它是什么意思。在这种情况下,'拒绝连接'具有一个含义:没有任何内容在您指定的IP:端口上进行侦听。与授权无关。 – EJP

+0

@EJP:“拒绝连接”并不总是意味着一个端口不在监听(在这种情况下,它会)。它也可能意味着端口正在监听,但其暂挂连接的积压目前已满。这也可能意味着中间防火墙在连接到达侦听端口之前阻止了连接。 “拒绝连接”仅仅意味着 - 连接被拒绝,但客户不知道为什么它被拒绝。 –

回答

0

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

但是,既然你说你正在寻找一个解决方案而不改变路由器配置,你需要一些不同的东西。

在这种情况下,您可以设置在公共Internet上运行的中间服务器,这两台计算机可以连接并作为它们之间的中间隧道平台。这个解决方案已经存在,例如看看ngrok,它有可用的Python绑定。

+0

他没有试图连接到系统B.他正尝试通过其公共IP地址连接到系统A.阅读问题。 – EJP

+0

@EJP - 没关系,两个系统在可访问性上都是一样的。并且系统A没有公共IP地址,系统A使用的默认网关路由器具有公共IP地址。同样的B.我的答案仍然存在。 –

+0

你的答案以'你不能直接连接到系统B'开始,它与被问到的问题无关。你可以随时解决它。 – EJP

-1

所以我想知道如何通过互联网连接套接字到另一个套接字而无需更改路由器配置。

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

+0

如果路由器支持uPNP,监听器可以动态地打开路由器上的端口并将传入连接转发给自己。否则,路由器管理员必须手动配置路由器的端口转发。 –

0

从书中"Computer Networking: A Top-Down Approach",有这149页的非常有趣的Bittorents是如何工作的一个组成部分:

每个洪流有一个叫做跟踪基础设施节点。当一个peer加入一个torrent时,它会向tracker注册自己,并定期通知tracker它仍然在torrent中。以这种方式,跟踪器跟踪正在参与该洪流的同伴。一个给定的洪流可能有不到十个或超过一千个参与者在任何时刻。 翘,加入洪流,跟踪器随机地选择对等体的一个子集(对于具体,说50)从所述一组参与的同层,且发送的IP地址,这些对等端50向Alice的。拥有这个对等列表,Alice尝试与该列表上的所有对等方建立并发TCP连接。我们将所有与Alice建立TCP连接成功的对等体称为“邻居对等体”。

image

所以:

- 第1步:爱丽丝连接到跟踪器,跟踪器给爱丽丝和鲍勃米克的IP地址。

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

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

那么我错过了什么?

+0

问题不是一个答案,并且在这里没有证据表明您成功连接到其端口未打开和转发的路由器后面的任何其他主机。 – EJP

+1

如果你真的想知道BitTorrent对等体如何通过路由器相互连接,请阅读各种[BitTorrent协议规范](http://www.bittorrent.org/beps/bep_0000.html)。另请参阅[为什么BitTorrent不需要端口转发?](http://superuser.com/questions/952061/)。 –