【问题标题】:How to send/receive layer 2 frames on wlan如何在 wlan 上发送/接收第 2 层帧
【发布时间】:2011-02-01 21:11:28
【问题描述】:

我想做的事:在用户空间实现第 2 层协议。

所以我在 Linux 2.6.32 下使用 pcap 来嗅探数据包:

    ...
    struct pcap_t *pcap_h = pcap_open_live("wlan0", BUFSIZ, 1, 0, errbuf);
    ...
    while (1) { 
          int ret = pcap_loop(pcap_h, -1, newpkt_callback, NULL);
          ...
    }
    ...

这适用于所有数据包。但是,当我使用 pcap 发送没有 ether_head 和 IP 标头的数据包时:

    const char pkt[] = "WHATEVER";
    nsent = pcap_sendpacket(pcap_h, (const u_char *)pkt, len);
    ...

我只能在本地主机上嗅探数据包,而不能在运行相同程序的其他笔记本电脑上嗅探。所以问题是“如何在 wlan 上广播没有 ether_head 的消息”?任何指针将不胜感激。

【问题讨论】:

    标签: c sockets networking unix pcap


    【解决方案1】:

    如果您使用的是接入点(基础架构模式),则无法执行此操作,因为接入点会在其他无线站之间中继帧,因此必须知道如何使用您的第 2 层协议。

    我建议在第 3 层实现您的协议(您可能想查看PF_PACKET 套接字)。

    【讨论】:

    • 我确实尝试过使用原始套接字和 PF_PACKET,但问题仍然存在。至于 AP,协议的全部意义在于不使用接入点。换句话说,我正在寻找一种将数据简单地注入无线设备并在另一端接收它们的方法。
    • @Peyman:你实际上是在 ad-hoc 模式下关联卡片吗?此外,一些无线网卡根本不支持混杂模式。
    • 我也尝试过 ad-hoc 模式。对于混杂模式,pcap_open_live 不应该在警告时返回吗?
    • @Peyman:在我的测试中,混杂模式显然是成功的,但对相关卡片没有任何影响。 (我仍然看不出有任何理由不能使用标准的第 2 层协议——可能在所有帧上使用第 2 层全站地址——使用自定义第 3 层协议来达到相同的结果)。
    【解决方案2】:

    您必须发送带有标题的完整帧,而不仅仅是一些随机数据。 在函数 pcap_inject() 中查看本手册 http://linux.die.net/man/3/pcap。在创建新框架时,这可以帮助http://www.tcpdump.org/pcap.html,或者只使用 libnet 库http://libnet.sourceforge.net/libnet.html

    【讨论】:

      猜你喜欢
      • 2018-03-09
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多