【问题标题】:Can't assign requested address : Python Multicasting无法分配请求的地址:Python 多播
【发布时间】:2013-11-05 20:26:19
【问题描述】:

我刚开始接触网络,正在编写一个非常简单的多播代码。我仍然不确定不同的接口。一些示例使用“0.0.0.0”,而其他示例使用“127.0.0.1”。

服务器代码

import socket
import sys
import time

ANY = socket.gethostbyname('localhost')
S_PORT = 1501
M_ADDR = "224.168.2.9"
M_PORT = 1600

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEPORT,1)
sock.bind((ANY,S_PORT))
sock.setsockopt(socket.IPPROTO_IP,socket.IP_MULTICAST_TTL,255)

while 1:
    message = raw_input("Enter message: ")
    sock.sendto(message,(M_ADDR,M_PORT))
    if message == "exit":
        break
sock.close()

客户代码

import socket
import time
import sys

ANY = socket.gethostbyname('localhost')
M_ADDR = "224.168.2.9"
M_PORT = 1600
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEPORT,1)
sock.bind((ANY,M_PORT))
sock.setsockopt(socket.IPPROTO_IP,socket.IP_MULTICAST_TTL,255)
status = sock.setsockopt(socket.IPPROTO_IP,socket.IP_ADD_MEMBERSHIP,socket.inet_aton(M_ADDR) + socket.inet_aton(ANY))

while 1:
    data,addr = sock.recvfrom(1024)
    print "Received message from " + str(addr) + " : " + data
    if data == "exit":
        break
sock.close()

客户端代码正常运行,正在等待接收套接字上的消息。但是,只要我输入任何消息,代码服务器就会崩溃。

Traceback (most recent call last):
  File "multicast_server.py", line 17, in <module>
    sock.sendto(message,(M_ADDR,M_PORT))
socket.error: [Errno 49] Can't assign requested address

是什么导致了这个问题? 如果我使用ANY = "0.0.0.0",上面的代码就可以工作。这是为什么 ?有什么变化?

【问题讨论】:

  • 你确定你想要SO_REUSEPORT而不是SO_REUSEADDR吗? (This answer 解释了它们在每个平台上的含义。)
  • 是的,我使用的是需要SO_REUSEPORT 的 MAC OSX。该链接很有帮助,因为我很困惑为什么会有差异!

标签: python networking udp multicast


【解决方案1】:

在 IPv4 中,0.0.0.0 是一个特殊地址,又名INADDR_ANY,意思是“在每个接口上绑定所有可能的地址”。

因此,224.168.2.9 的多播网络,如果它完全可以访问,那么肯定可以从绑定到 0.0.0.0 的套接字访问。

同时,127.0.0.1 是一个特殊地址,又名INADDR_LOOPBACK,表示“仅在环回设备上绑定本地主机”。除了该套接字上的本地主机本身之外,没有其他方法可以访问。特别是,您无法访问您的多播网络。无论您获得ENETUNREACHENETDOWN 还是EADDRNOTAVAIL 都是特定于平台的,但它是否有效不是——它不可能有效。

如果您想在不测试多台计算机的情况下测试多播,则需要设置一个具有多个地址的环回网络,这样您就可以将客户端、服务器和多播组都绑定到其中的不同地址网络。

【讨论】:

    【解决方案2】:

    当您在 python 中使用 "0.0.0.0""" 进行网络连接时,它会打开任何 IP 入站。对于您的情况,我会使用 "0.0.0.0""127.0.0.1"(如果您不愿意向世界开放。)

    【讨论】:

      【解决方案3】:

      获取您的设备 IP 地址 ubuntu: ifconfig

      从任何以太网、环路、无线局域网中选择 IP 地址 将 M_ADDR 替换为该 IP 地址

      【讨论】:

        猜你喜欢
        • 2012-08-12
        • 1970-01-01
        • 2016-10-31
        • 2021-02-28
        • 2013-09-15
        • 2021-11-03
        • 2013-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多