尝试绑定到套接字时出现"OSError: [Errno 22] Invalid argument"错误


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

从外观上看,您在receive_broadcast_thread()函数的第二行提供了一个无效的主机名(空字符串(。

AFAICT,您最多可以bind一个套接字一次。例如,Linux手册页上写着:

EINVAL套接字已绑定到一个地址。

EINVAL错误号定义为:

#define EINVAL          22      /* Invalid argument */

这似乎与你得到的相匹配。

为了解决您的问题,我会尝试将bindreceive_broadcast_thread移到您设置所有套接字选项之后

相关内容

最新更新