Python: [WinError 10054] Существующее соединение было принудительно закрыто удаленным хостом.

Я создаю клиент чата на основе сервера, и каждый раз, когда я настраиваю сервер и клиент, сервер продолжает прослушивать соединение, и когда клиент пытается подключиться, появляется эта ошибка [WinError 10054] An existing connection was forcibly closed by the remote host, однако сервер все еще прослушивает соединение. Я использую Python версии 3.6.1.

Скрипт

import socket
import threading

clients = []
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

mode = input("Enter 1 for server mode and enter 2 for client mode")
if mode == "1":

    def get_ip():
        try:
            stest = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            stest.connect(('10.255.255.255', 1))
            IP = stest.getsockname()[0]
        except:
            IP = '127.0.0.1'
        finally:
            stest.close()
        return IP
    print("IP: " + get_ip())
    s.bind((get_ip(), 7999))
    s.setblocking(0)

    print("Waiting for connection")
    while True:
        try:
            data, addr = s.recvfrom(1024)
            if data.decode() == "Quit":
                quitmsg = str(addr) + " has quit the chat."
                clients.remove(addr)
                for client in clients:
                    s.sendto(quitmsg.encode("utf-8"), client)
                break
            elif data:
                print(data)
                if addr not in clients:
                    clients.append(addr)
                    print(clients[0])
                for client in clients:
                    print(client)
                    s.sendto(data, client)
        except:
            pass
        s.close()


elif mode == "2":
    while True:
        try:
            ip = input("Enter in an ip address")
            socket.inet_aton(ip)
        except socket.error:
            print("Invalid IPv4 address")
            continue
        while True:
            try:
                port = int(input("Enter in port number"))
            except ValueError:
                print("Invalid Port Number")
                continue
            break
        addr = (ip, port)
        break
    s.connect(addr)

    def recvmsg():
        while True:
            data = s.recv(1024)
            print(data)
            if data:
                print(data.decode())

    recv = threading.Thread(name="recvmsg", target=recvmsg)
    recv.daemon = True
    recv.start()

    while True:
        string = input(">>")
        s.send(string.encode("utf-8"))
        if str(string) == "Quit":
            break

    s.close()
    print("Disconnected from chat")

Сервер ожидает подключения даже после того, как клиент не может подключиться

Клиенту не удалось подключиться


person Kozero    schedule 17.05.2017    source источник


Ответы (1)


Если ваш сервер не находится в локальной сети, убедитесь, что порт 7999 открыт и перенаправлен на его точку доступа. В противном случае пакеты будут просто отбрасываться маршрутизатором. Если он находится в вашей локальной сети, все равно попробуйте переадресовать. Также согласно https://www.speedguide.net/port.php?port=7999 порт использовался червем, поэтому, возможно, он навсегда закрыт в другой сети?? Маловероятно, но возможно.

person pointerless    schedule 17.05.2017
comment
Сначала я подумал, что маршрутизатор находится в режиме изоляции точки доступа, но потом попробовал его на своем петлевом интерфейсе 127.0.0.1 и получил тот же ответ. - person Kozero; 17.05.2017
comment
Хм, а может быть проблема в брандмауэре? Попробуйте посмотреть логи - person pointerless; 17.05.2017
comment
Я не думаю, что это работало нормально, когда у меня были функции клиента и сервера в обоих разных сценариях. Также я запускаю два разных экземпляра одного и того же скрипта, если это имеет значение. - person Kozero; 17.05.2017
comment
Может быть, запустить их на разных компьютерах и посмотреть, работает ли это? - person pointerless; 17.05.2017
comment
Я не думаю, что это проблема, он работал нормально, когда они были в двух отдельных сценариях, работающих на одном компьютере. - person Kozero; 17.05.2017
comment
Для меня сервер фактически не реагирует на соединение, клиент не выдает никаких ошибок. Попробуйте в питоне 2.7? измените свои входные данные на raw_inputs. В остальном я не вижу проблемы - person pointerless; 17.05.2017