Как сбросить использование адреса сокета в python? (решить WinError 10048) - PullRequest
0 голосов
/ 30 мая 2019

После создания небольшой программы Pygame, я хочу сделать ее удобной для многопользовательской игры, с возможностью играть локально.Моя цель - позволить двум независимым игрокам в моем мире!

Итак, я в основном пытался научиться использовать модуль сокетов python.

Хорошо, давайте начнем, мой первыйбыла попытка подключить клиента к базовому серверу.

Я следую очень хорошему руководству и получаю окончательный код, основанный на этой структуре:

#server.py

import socket
from threading import Thread

class Serv(Thread):


    def __init__(self, conn):
        Thread.__init__(self)
        self.conn = conn

    def run(self):
        data = self.conn.recv(1024)
        data = data.decode("utf8")
        print(data)


host, port = ('', 8486)

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind((host, port))

run = True

while run :
    socket.listen(5)
    conn, adress = socket.accept()

    thread_serv = Serv(conn)
    thread_serv.start()
conn.close()
socket.close()

И:

#client.py

import socket

host, port = ('localhost', 8486)



try:
    socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket.connect((host, port))
    print("You're in !")

    data = "bonjour"
    data = data.encode("utf8")
    socket.sendall(data)

except ConnectionRefusedError:
    print("There is no server to join !")
except :
    print("connexion lost...")
finally:
    socket.close()

При первом запуске этих двух программ (сначала server.py, а затем client.py) все работает отлично.

Но когда я запускаю его второй раз, консоль возвращает меня:

Traceback (most recent call last):
  File "C:\Users\Cédric\Documents\logiciels\python\By Edhyjox\Tower\bin\serveur.py", line 20, in <module>
    socket.bind((host, port))
OSError: [WinError 10048] Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est habituellement autorisée
[Finished in 0.1s]

если я переведу вам последнюю строку, это будет иметь дело с чем-то вроде этого: Only one use of each socket address ( protocol/network address/port) is usually allowed

Я знаю, что это приходит из порта, потому что, когда я изменяю его, он снова работает, пока я неt использовать два раза один и тот же порт.

Но есть ли способ сбросить все используемые порты и сделать их снова пригодными для использования?

1 Ответ

1 голос
/ 05 июня 2019

Ваш код пытается вызвать listen несколько раз. Это не верно. Ожидается, что listen будет вызван один раз, для каждого нового соединения должен быть вызван только accept. Ваш код должен быть:

...
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind((host, port))
socket.listen(5)

run = True

while run :
    conn, adress = socket.accept()

    thread_serv = Serv(conn)
    thread_serv.start()
conn.close()
socket.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...