python - 如何通过本地主机使用多播限制流量

标签 python sockets localhost multicast

我在本地主机上使用多播 UDP 来实现在一台机器上运行的协作程序的松散集合。以下代码在 Mac OSX、Windows 和 linux 上运行良好。缺陷是代码也会在本地主机网络之外接收 UDP 数据包。例如,sendSock.sendto(pkt, ('192.168.0.25', 1600)) 从我网络上的另一个盒子发送时被我的测试机器接收。

import platform, time, socket, select

addr = ("239.255.2.9", 1600)

sendSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sendSock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 24)
sendSock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, 
    socket.inet_aton("127.0.0.1"))

recvSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
recvSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
if hasattr(socket, 'SO_REUSEPORT'):
    recvSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, True)

recvSock.bind(("0.0.0.0", addr[1]))
status = recvSock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, 
    socket.inet_aton(addr[0]) + socket.inet_aton("127.0.0.1"));

while 1:
    pkt = "Hello host: {1} time: {0}".format(time.ctime(), platform.node())
    print "SEND to: {0} data: {1}".format(addr, pkt)
    r = sendSock.sendto(pkt, addr)

    while select.select([recvSock], [], [], 0)[0]:
        data, fromAddr = recvSock.recvfrom(1024)
        print "RECV from: {0} data: {1}".format(fromAddr, data)

    time.sleep(2)

我尝试过 recvSock.bind(("127.0.0.1", addr[1])),但这会阻止套接字接收任何多播流量。是否有正确的方法将 recvSock 配置为仅接受来自 127/24 网络的多播数据包,或者我是否需要测试每个接收到的数据包的地址?

最佳答案

与此处其他答案中所述相反,IPv4 支持基于 TTL 的多播范围,如下所示:

0: node-local (not forwarded outside the current host)
1: link-local (not forwarded outside the current subnet)
< 32: site-local
< 64: region-local
< 128: continent-local
< 255: global

(它也支持 Administratively Scoped Multicast 。)

资料来源:W.R. Stevens,Unix 网络编程第 2nd 版,第 I 卷,第 19.2 节,更正匹配 RFC 2365 .

关于python - 如何通过本地主机使用多播限制流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2879046/

相关文章:

python - 使用 Python 3 的 HTTP Post 请求

Java程序阻塞端口?

java - [vert.x]Vertx tcp 套接字在写入快速时读取部分消息

asp.net - 图片上传 - 本地主机中断

php - Xampp 本地主机/仪表板

python - 如何使用 keras 将数组 reshape 为 3d

python - 为什么 Python 正则表达式 ".*PATTERN*"匹配 "XXPATTERXX"?

python - 搞砸了 numpy 安装 - `GFORTRAN_1.4' 未找到错误

sockets - 服务器上的SSH自动化

azure - 在azure计算模拟器中不断更改127.0.0.x地址