【发布时间】: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