【问题标题】:join/leave multicast group using libpcap使用 libpcap 加入/离开多播组
【发布时间】:2010-10-27 11:29:48
【问题描述】:

我需要接收多播流,但在 CentOS 5.5 上按源 MAC 地址过滤传入数据包。 我打算使用libpcap 库。 是否可以使用libpcap 加入/离开多播组? 如果是,该怎么做?

谢谢

【问题讨论】:

    标签: linux networking network-programming multicast libpcap


    【解决方案1】:

    当然,只需构造并发送适当的 IGMP 数据包即可。

    【讨论】:

    • 怎么做?我需要使用什么 API?
    • 上面的答案比我的建议要好。但是,如果您可以将源 MAC 地址与 IP 地址相关联,那么您最好在应用程序中执行 all,根本不使用 libpcap。只需将 MC 套接字连接到所需的源 IP 地址,这将过滤掉其他所有内容。如果需要多个源,您可以在同一端口上运行多个 MC 套接字。
    • 我不需要接收我的应用程序正在生成的数据包。我创建了过滤器,除了来自我自己 MAC 地址的数据包之外,所有数据包都通过了
    • 有一个套接字选项。你真的很难做到这一点!使用 UDP 套接字完成所有操作,这很容易。好吧,更容易。
    • IP_MULTICAST_LOOP 或 IPv6_MULTICAST_LOOP。但即使你没有它,在你的应用程序代码中检查传入数据报的 IP 地址也会更简单,完全忘记 libpcap。多播已经够难了 ;-)
    【解决方案2】:

    1.创建虚拟套接字:sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    2.绑定:rc = bind(sd, (sockaddr*) &addr, sizeof(sockaddr_in));

    3.加入多播组:

    ip_mreq mreq;
    mreq.imr_interface.s_addr = htonl(InterfaceIp);
    mreq.imr_multiaddr.s_addr = htonl(DestIp);
    if (setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
      close(sd);
      // Error handle...
    }
    

    不要使用虚拟套接字发送或接收数据包

    4.使用pcap_open_live()打开pcap

    一般的想法是使用常规套接字来“告诉”内核发送 IGMP 加入数据包,然后使用 pcap 来捕获数据包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 2021-06-05
      • 2018-02-02
      • 2013-08-02
      • 2013-04-01
      相关资源
      最近更新 更多