Can';t分配请求的地址:Python多播

Can';t分配请求的地址:Python多播,python,networking,udp,multicast,Python,Networking,Udp,Multicast,我刚开始接触网络,正在编写一个非常简单的多播代码。我仍然不确定不同的接口。一些示例使用“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

我刚开始接触网络,正在编写一个非常简单的多播代码。我仍然不确定不同的接口。一些示例使用“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
回溯(最近一次呼叫最后一次):
文件“multicast_server.py”,第17行,在
sock.sendto(消息,(M_地址,M_端口))
socket.error:[Errno 49]无法分配请求的地址
是什么导致了这个问题?
如果我使用
ANY=“0.0.0.0”
,上述代码可以工作。为什么呢?什么变化?

在IPv4中,0.0.0.0是一个特殊地址,也称为
INADDR\u ANY
,意思是“绑定每个接口上的每个可能地址”

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

同时,127.0.0.1是一个特殊地址,也称为INADR_LOOPBACK,意思是“仅在环回设备上绑定本地主机”。除了该套接字上的本地主机本身之外,无法访问任何内容。特别是,您无法访问多播网络。无论您获得的是
enetureach
enedown
,还是
EADDRNOTAVAIL
都是特定于平台的,但它是否起作用并不重要,它不可能起作用

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

在python中使用
“0.0.0”或
进行联网时,它向任何入站IP开放。对于您的情况,我会使用
“0.0.0.0”
“127.0.0.1”
(如果您不愿意向世界开放。)

获取您的设备ip地址 ubuntu:ifcongfig

从任何以太网、环路、wlan中选择ip地址
将M_ADDR替换为该ip地址

您确定要
SO_REUSEPORT
而不是
SO_REUSEADDR
?(解释了它们在每个平台上的含义)是的,我使用的是MAC OSX,它需要
SO\u REUSEPORT
。链接很有帮助,因为我不明白为什么会有区别!