微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用localhost上的多播限制流量

如何解决如何使用localhost上的多播限制流量

不幸的是,多播IP没有任何此类“按子网过滤”功能-因此,除非您想破坏IPTables(在Linux上)或系统/网络的等效“防火墙” SW / HW来尝试并“丢弃”底层”,您不喜欢的每个多播数据包,我认为您都必须在应用程序级别执行(fromAddr例如,在内部循环中进行测试)。来自其他主机的IP流量会大大降低性能吗?

解决方法

我在本地主机上使用多播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.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网络的多播数据包,还是我需要测试每个接收到的数据包的地址?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。