【问题标题】:Socket Error : No connection could be made because targeted machine actively refused it套接字错误:无法建立连接,因为目标机器主动拒绝它
【发布时间】:2019-12-09 11:27:47
【问题描述】:

注意:这个问题已经完全解决了,就像在 server.py 之前运行 client.py 一样

刚刚开始使用套接字编程,我创建了以下代码并希望打印一些字节消息,但它没有这样做。

我只想让任何人都可以在任何 机器。但是机器拒绝这样做。

这是我的代码:

server.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 12048

s.bind((socket.gethostname(), port))

s.listen()

while True:
    c, addr = s.accept()
    print("Got connection from", addr)

    c.send(bytes("Thank you", "utf-8"))

client.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 12048

s.connect(('192.168.0.1', port))

msg = s.recv(1024)
print(msg.decode("utf-8"))

一些图片可以更好地解释我的错误:

任何帮助将不胜感激!!!

【问题讨论】:

  • 您确定socket.gethostname() 返回IP 地址192.168.0.1 的主机名吗?你确定192.168.0.1 地址吗?这是网关的通用地址,但主机不通用。
  • 那我该怎么办?如果我键入另一个主机名/IP 地址,则表示防火墙已阻止它。
  • 你在哪里运行服务器?你在哪里运行客户端?它们是否在同一个系统(机器、主机)上?然后将127.0.0.1 用于bindconnect 调用。否则,您需要找出服务器主机的实际公共地址,并将其用于connect 调用。我还建议您使用通配符地址'' 进行bind 调用,这样服务器将侦听所有可用接口上的连接。
  • 萌芽到 0.0.0.0,除非你有充分的理由不这样做。

标签: python python-3.x sockets python-sockets


【解决方案1】:

看起来在server.py 脚本中您使用s.bind((socket.gethostname(), port)),其中socket.gethostname() 是主机名,但在client.py 脚本中您使用s.connect(('192.168.0.1', port)),其中'192.168.0.1' 是您尝试连接的主机名。

我认为你有 socket.gethostname() != '192.168.0.1' 这就是问题所在。

此外,您可以使用此解决方案Python socket bind to any IP? 绑定到主机上的所有可用 IP 地址

让我们使用listen_ip = socket.gethostbyname(socket.gethostname()) 进行连接,因为socket.gethostname() 可能返回主机名而不是IP,并且如果它是本地名称而不是DNS,则本地网络中的python dns 解析器将无法解决。

稍后将其用作s.bind((listen_ip, port))s.connect((listen_ip, port))

经过一些调试,我为您找到了一个可行的解决方案

有需要的脚本。

server.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname(socket.gethostname())
port = 12_048

s.bind((host, port))

s.listen()
print("Server listening @ {}:{}".format(host, port))

while True:
    c, addr = s.accept()
    print("Got connection from", addr)

    c.send(bytes("Thank you", "utf-8"))

client.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.1.162'  # The IP printed by the server must be set here

# or we can set it using env variable named SERVER_IP
if 'SERVER_IP' in os.environ:
    host = os.environ['SERVER_IP']

port = 12048

print("Connecting to {}:{}".format(host, port))
s.connect((host, port))

msg = s.recv(1024)
print(msg.decode("utf-8"))

【讨论】:

【解决方案2】:

在一次聊天对话中,我们得出结论,问题中的硬编码 IP 不是正确的。该解决方案确实具有他需要的 IP,但在每种情况下都会有所不同。请记住 server.py 需要先启动,当您看到打印的 Server listening @ IP:12048 时,将 IP 写入 client.py 并启动它。即使您已经知道 IP,也需要在看到该行后启动客户端,因为服务器需要一些时间才能准备好,如果客户端在未准备好时尝试连接到服务器,客户端将崩溃。

server.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname(socket.gethostname())
port = 12048

s.bind((host, port))

s.listen()
print("Server listening @ {}:{}".format(host, port))

while True:
    c, addr = s.accept()
    print("Got connection from", addr)

    c.send(bytes("Thank you", "utf-8"))

client.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.1.162'  # The IP printed by the server must be set here
port = 12048

print("Connecting to {}:{}".format(host, port))
s.connect((host, port))

msg = s.recv(1024)
print(msg.decode("utf-8"))

【讨论】:

  • 这段代码完全正确。但不能在我的机器上工作。现在我从一开始就相信这是机器的错,而不是代码。你能建议我如何解决这个问题吗?
  • 如何更正代码。发生了什么变化?仅有代码是不够的。你必须解释。
  • @user207421 在聊天对话中调试了 2 个错误,并出现在此脚本中。两者都在上面进行了解释。第一个是他在客户端的硬编码 IP 与服务器 IP 不匹配。通过如上所述打印Server listening @ IP:12048 消息,您可以获得服务器IP。然后按照评论建议在客户端脚本中使用它。第二个错误是他同时启动了两个脚本,并且服务器需要一些时间准备好,然后客户端才能尝试连接。答案中也对此进行了说明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 2023-03-25
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多