我刚刚开始使用网络,并且正在编写一个非常简单的多播代码。我仍然不确定不同的接口。一些示例使用“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"
,则上述代码有效。这是为什么 ?有什么变化?
答案 0 :(得分:4)
在IPv4中,0.0.0.0是一个特殊地址,又名INADDR_ANY
,表示“绑定每个接口上的每个可能的地址”。
因此,224.168.2.9的组播网络,如果可以访问,肯定可以从绑定到0.0.0.0的套接字到达。
同时,127.0.0.1是一个特殊地址,又名INADDR_LOOPBACK
,意思是“仅在环回设备上绑定localhost”。在该套接字上除了本地主机本身之外没有任何其他方法可以访问。特别是,您无法访问多播网络。您是否获得ENETUNREACH
,ENETDOWN
或EADDRNOTAVAIL
是特定于平台的,但是否有效则无法实现。
如果要在不通过多台计算机进行测试的情况下测试多播,则需要设置一个具有多个地址的环回网络,这样您就可以将客户端,服务器和多播组全部绑定到其中的不同地址网络
答案 1 :(得分:1)
当您在python中使用"0.0.0.0"
或""
进行网络连接时,它会打开任何IP入站。对于您的情况,我会使用"0.0.0.0"
或"127.0.0.1"
(如果您不习惯向世界开放。)
答案 2 :(得分:-3)
获取您的设备IP地址 ubuntu:ifcongfig
从任何以太网,循环,wlan中选择IP地址 用该IP地址替换M_ADDR