Linux下组播报文的发送与接收

一、组播报文的发送

作为组播信息的提供者向组播组发送报文

可以参考如下代码:

首先需要将组播ip加入路由表中:

sudo route add -net 239.127.15.11 netmask 255.255.255.255 dev eth1

参数说明:

239.127.15.11:为组播ip

eth1:为发送报文的网卡名称(通过ifconfig查看) 

import socket

DSTPORT = 11111     #报文的目的端口
SRCPORT = 22222     #报文的源端口
SRCADDR = '192.168.23.12'       #发送报文的网卡ip
MULTICAST = '239.127.15.11'    #组播组ip


class MultiCastSend:

    def __init__(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.multicast_group = (MULTICAST, DSTPORT)
        self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)
        self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
                               socket.inet_aton(MULTICAST) + socket.inet_aton(SRCADDR))

    def send_multicast_data(self, data: bytes):
        self.socket.sendto(data, self.multicast_group)

    def close(self):
        self.socket.close()


if __name__=="__main__":
    send_obj = MultiCastSend()
    content = b'\x01\x02\x03\x04'
    send_obj.send_multicast_data(content)
    send_obj.close()
    

二、组播报文的接收

Linux下通过socket接收组播报文时,同理需要将组播ip加入路由。

可以参考如下的代码:

import socket


class MultiCastRecv:


    def __init__(self,multicastip:str,port:int,timeout=5):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        multicast_group = multicastip
        address = ('', port)
        group = socket.inet_aton(multicast_group)
        mreq = struct.pack('4sL', group, socket.INADDR_ANY)
        test_socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
        test_socket.bind(address)
        test_socket.settimeout(timeout)
        self.data = None

    
    def recv_data(self):
         self.data,addr = self.socket.recvfrom(4096)


if __name__ == "__main__":
    recv_obj = MultiCastRecv('239.127.11.1',11111)
    recv_obj.recv_data()
    content = recv_obj.data
    print(f'Recv data is {content}')
        

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于Linux系统中无法接收到带有VLAN的IPv6组播报文的问题,可能有以下原因和解决办法: 原因: 1. 网卡驱动不支持VLAN:某些网卡驱动可能没有正确实现VLAN标记的处理。 2. 系统网络配置错误:可能未正确配置VLAN接口或者网络桥接。 3. 防火墙配置问题:可能防火墙设置了规则限制了IPv6组播报文接收。 解决办法: 1. 检查网卡驱动支持情况:查看网卡驱动是否支持VLAN标记的传输。可以通过`lspci`命令查看网卡型号,并查阅相关文档或官方网站确认是否支持VLAN。 2. 配置VLAN接口:使用`ip`命令创建和配置VLAN接口,例如: ``` ip link add link eth0 name eth0.100 type vlan id 100 ip addr add <IPv6地址/子网掩码> dev eth0.100 ip link set dev eth0.100 up ``` 上述命令创建了一个名为eth0.100的VLAN接口,并配置了相应的IPv6地址。 3. 配置网络桥接(如果需要):如果存在网络桥接,需要确保正确配置桥接接口和VLAN接口之间的连接。 4. 检查防火墙规则:使用`ip6tables`命令查看和修改IPv6防火墙规则,确保没有限制IPv6组播报文接收。可以尝试禁用防火墙进行测试,确认是否与防火墙有关。 关于IPv6组播发送接收及处理的详细流程,可以简单概括如下: 1. 组播地址的生成:IPv6组播地址由固定的前缀(`FF00::/8`)和组播组标识符(32位)组成。 2. 组播报文发送发送方通过将报文目标地址设置为组播地址,将报文发送到目标网络上。 3. 组播路由:组播报文通过组播路由器进行转发,路由器会根据组播地址的前缀进行匹配和转发。 4. 组播报文接收接收方的网卡会监听组播地址,如果匹配到目标组播地址,将接收到该报文。 5. 组播报文的处理:接收方的操作系统会根据需要处理接收到的组播报文,例如交给相应的应用程序进行处理。 需要注意的是,以上仅为简单概括,实际的IPv6组播流程可能涉及更多细节和协议。具体实现和配置可能会因不同的Linux发行版和网络环境而有所差异,请参考相关文档或官方资源进行具体操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值