【问题标题】:"OSError: [Errno 22] Invalid argument" error when trying to bind to a socket尝试绑定到套接字时出现“OSError: [Errno 22] Invalid argument”错误
【发布时间】:2020-05-01 16:31:19
【问题描述】:
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

【问题讨论】:

    标签: python sockets udp broadcasting


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      AFAICT,您最多可以bind 一个套接字。例如,Linux man pages 说:

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

      EINVAL错误号定义为:

      #define EINVAL          22      /* Invalid argument */
      

      这似乎与你得到的相符。

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

      【讨论】:

      • 感谢您的评论。这确实解决了错误,但是当我尝试同时从两个终端运行代码时,它会在两个终端中打印相同的端口号(在 receive_broadcast 函数中)但它应该打印两个端口号,因为它们应该充当两个单独的设备,对?
      • 这取决于get_broadcast_port 正在做什么。您正在设置 SO_REUSEADDR,因此您允许将多个程序绑定到该 UDP 端口。也许发布另一个包含相关细节的问题?
      猜你喜欢
      • 2021-08-26
      • 2016-11-03
      • 1970-01-01
      • 2022-11-04
      • 2020-04-07
      • 2018-06-15
      • 2018-12-02
      • 1970-01-01
      • 2020-02-15
      相关资源
      最近更新 更多