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 */
这似乎与你得到的相匹配。
为了解决您的问题,我会尝试将bind
从receive_broadcast_thread
移到您设置所有套接字选项之后