【问题标题】:Errno 10060 when trying to connect from a local client to the my server using my external ip adress尝试使用我的外部 IP 地址从本地客户端连接到我的服务器时出现 Errno 10060
【发布时间】:2017-11-09 05:19:05
【问题描述】:

我正在尝试使用套接字在 python 中创建多连接服务器。不是通过任何真正的协议,而是通过自己定义的协议。

我的服务器使用我的本地 IP (127.0.0.1) 正常运行,现在我希望我的朋友连接但我们不断收到此错误:[Errno 10060] 连接尝试失败,因为连接方没有正确响应一段时间后,或建立连接失败,因为连接的主机没有响应。

我已正确打开端口并将我的服务器 ip 设置为 ipconfig 给出的 ip。我错过了什么或做错了什么?

这是相关的服务器代码:

def initialize():

    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # Setup a server socket

    server_port = raw_input("Enter the port to run the server on\n")  # Ask the admin for port
    while server_port.isdigit() is not True:
        server_port = raw_input("Enter the port to run the server on\n")

    server_socket.bind((LOCAL_IP, int(server_port)))  # Bind the server socket to this computer

    inputs.append(server_socket)

    terminated = False
    while not terminated:

        readable_sockets, writable_sockets, error_sockets = select.select(inputs, outputs, [])  # check which of the
        handle_inputs(readable_sockets, server_socket)
        handle_messages(writable_sockets) # this works on my local ip server
        # sockets we expect to use are actually free


def handle_inputs(readable_sockets, server_socket):
    """
    This functions purpose is to read all inputs given by users, and create new requests accordingly

    :param readable_sockets: a list of sockets which are waiting to be read
    :param server_socket: the socket of the server
    """

    for cur_socket in readable_sockets:

        if cur_socket is server_socket:
            new_socket, new_ip = server_socket.accept(1)

            answers_queue.append(Answer(new_socket, Answer.HND_TYPE, 9, "handshake"))
            if new_socket not in outputs:
                outputs.append(new_socket)

这是相关的客户端代码:

def main():
    my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    my_socket.connect((EXTERNAL_IP, PORT))
    data = my_socket.recv(1)
    if data == 'H':
        print my_socket.recv(int(my_socket.recv(2)))
    else:
        print "ERRRRRRRRRRRRRRRRR"

【问题讨论】:

  • LOCAL_IP 是什么?
  • 您的代码已损坏:recv 最多读取给定的字节数,而不是这个数字。
  • @Daniel,recv 使用我制定的协议,这就是为什么它是一个硬编码的数字。它确实适用于本地连接
  • 10060 是超时错误,而不是连接错误。客户端代码期望服务器在客户端连接后立即发送消息。实际发送该消息的服务器代码在哪里?为什么要在将new_socket 添加到outputs 之前对消息进行排队?服务器是否有可能尝试过早发送排队的消息,或者更糟的是忽略它?
  • @RemyLebeau 这不太可能,因为服务器在本地连接上正常运行

标签: python sockets server


【解决方案1】:

127.0.0.1 是一个回环IP,它不存在于本地机器之外。如果将服务器套接字绑定到127.0.0.1,那么只有同一台机器上的客户端才能连接到127.0.0.1

如果服务器机器连接到 LAN,并且您希望同一 LAN 上的客户端连接到您的服务器套接字,它必须绑定到服务器机器的本地 LAN IP,或者绑定到0.0.0.0 以绑定到所有可用的本地 IP。

如果您希望来自 Internet 的客户端连接到您的服务器套接字,它们必须连接到您的 Internet 连接的公共 IP。

如果您的服务器计算机直接连接到 Internet 调制解调器,则服务器计算机的 LAN IP 是调制解调器的 Internet IP。那是您需要将服务器套接字绑定到的 IP。但是,如果您的服务器机器位于 LAN 路由器后面,那么您必须将路由器配置为将入站连接从路由器的公共 IP 端口转发到服务器机器的 LAN IP,然后将您的服务器套接字绑定到该 LAN IP。

当然,如果您的服务器机器有防火墙,请确保在其上打开所需的端口。

话虽如此,10060 是超时错误,而不是连接错误。您显示的客户端代码期望服务器在客户端连接后立即发送消息。但是服务器真的在发送那个消息吗?您展示了将消息排队的代码,但您没有展示实际发送消息的代码。

【讨论】:

  • 这很奇怪,我完全按照你说的做了(我是从互联网客户端转到局域网后面的服务器)。但这仍然行不通。无论如何,谢谢。
  • 准确定义“不工作”。有很多事情可能会出错。客户端是否连接,是或否?如果是,客户端是否收到任何数据,是还是否?报告的错误到底在哪里?在您的代码中的哪一步?请更具体地说明什么是行不通的。
  • 我建议您使用数据包嗅探器,如 Wireshark,以确保客户端连接到达服务器计算机。如果您在嗅探器中没有看到它们,则说明路由器配置不正确。如果您确实在嗅探器中看到了它们,但您的服务器代码没有看到它们,那么您的服务器代码有问题。
猜你喜欢
  • 2014-07-31
  • 2011-03-05
  • 2019-07-03
  • 2021-08-27
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 2010-12-22
  • 2011-10-25
相关资源
最近更新 更多