gpt4 book ai didi

python - 无法分配请求的地址 : Python Multicasting

转载 作者:太空宇宙 更新时间:2023-11-03 11:31:07 26 4
gpt4 key购买 nike

我刚开始接触网络,正在编写一个非常简单的多播代码。我仍然不确定不同的接口(interface)。一些示例使用“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",上面的代码就可以工作。这是为什么 ?有什么变化?

最佳答案

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

因此,位于 224.168.2.9 的多播网络,如果完全可达,则肯定可以从绑定(bind)到 0.0.0.0 的套接字到达。

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

如果你想测试多播而不是跨多台电脑测试,你需要建立一个具有多个地址的环回网络,这样你就可以将客户端、服务器和多播组都绑定(bind)到该网络中的不同地址网络。

关于python - 无法分配请求的地址 : Python Multicasting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19798254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com