Ошибка «OSError: [Errno 22] Недопустимый аргумент» при попытке привязки к сокету - PullRequest
0 голосов
/ 01 мая 2020
broadcaster = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
broadcaster.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
broadcaster.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

def send_broadcast_thread():
    msg = "test"
    while True:
        # TODO: write logic for sending broadcasts.
        broadcaster.sendto(msg.encode(), ('255.255.255.255', get_broadcast_port()))
        print(msg.encode())
        time.sleep(1)

def receive_broadcast_thread():
    broadcaster.bind(('', get_broadcast_port()))
    while True:
        data, (ip, port) = broadcaster.recvfrom(4096)
        print(f"RECV: {data} FROM: T{ip}:{port}")

Я получаю эту ошибку, когда пытаюсь запустить этот код. Я вызываю каждую их функцию в отдельном потоке демона.

line 88, in receive_broadcast_thread
    broadcaster.bind(('', get_broadcast_port())) OSError: [Errno 22] Invalid argument

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

AFAICT, вы можете bind сокет не более одного раза. Например, Linux справочные страницы говорят:

EINVAL Сокет уже привязан к адресу.

the EINVAL номер ошибки определяется как:

#define EINVAL          22      /* Invalid argument */

, который, кажется, совпадает с тем, что вы получаете.

Чтобы исправить вашу проблему, я бы попытался переместить bind из receive_broadcast_thread сразу после того, где вы установили все параметры сокета

0 голосов
/ 01 мая 2020

Судя по всему, вы вводите недопустимое имя хоста (пустую строку) во второй строке вашей receive_broadcast_thread() функции.

...