用于通过 wifi 无线电向其范围内的设备发送广播数据包的套接字程序

Socket program for sending broadcast a packet over wifi radio to a device in its range

我想要 运行 一个程序,用于通过 wifi 无线电将我自己的数据包发送到环境中。据我所知,如果我将以太网帧发送到目标 Mac 地址 ff:ff:ff:ff:ff:ff,就可以完成这项工作。所以我打开了一个原始套接字并按照代码构造了以太网头。

/* Open RAW socket to send on */
    if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) {
        perror("socket");
    }

    /* Get the index of the interface to send on */
    memset(&if_idx, 0, sizeof(struct ifreq));
    strncpy(if_idx.ifr_name, ifName, IFNAMSIZ-1);
    if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0)
        perror("SIOCGIFINDEX");
    /* Get the MAC address of the interface to send on */
    memset(&if_mac, 0, sizeof(struct ifreq));
    strncpy(if_mac.ifr_name, ifName, IFNAMSIZ-1);
    if (ioctl(sockfd, SIOCGIFHWADDR, &if_mac) < 0)
        perror("SIOCGIFHWADDR");

    /* Construct the Ethernet header */
    memset(sendbuf, 0, BUF_SIZ);
    /* Ethernet header */
    eh->ether_shost[0] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[0];
    eh->ether_shost[1] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[1];
    eh->ether_shost[2] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[2];
    eh->ether_shost[3] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[3];
    eh->ether_shost[4] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[4];
    eh->ether_shost[5] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[5];
    eh->ether_dhost[0] = 0xff;
    eh->ether_dhost[1] = 0xff;
    eh->ether_dhost[2] = 0xff;
    eh->ether_dhost[3] = 0xff;
    eh->ether_dhost[4] = 0xff;
    eh->ether_dhost[5] = 0xff;
    /* Ethertype field */
    eh->ether_type = htons(ETH_P_BATMAN);
    tx_len += sizeof(struct ether_header);

    /* Packet data */
    sendbuf[tx_len++] = 0xaa;
    sendbuf[tx_len++] = 0xaa;
    sendbuf[tx_len++] = 0xaa;
    sendbuf[tx_len++] = 0xaa;
    sendbuf[tx_len++] = 0xaa;
    sendbuf[tx_len++] = 0xaa;
    sendbuf[tx_len++] = 0xaa;
    sendbuf[tx_len++] = 0xaa;
    sendbuf[tx_len++] = 0xaa;
    sendbuf[tx_len++] = 0xaa;
    sendbuf[tx_len++] = 0xaa;
    sendbuf[tx_len++] = 0xaa;

我在路由器 运行 上以 AP 模式测试了这个程序,但问题是我只有在访问 WLAN SSID 时才能收到这个数据包。我的问题是当我在这个路由器传输范围内而不连接到它的 ssid 时如何接收这个数据包。任何帮助将不胜感激。

As my knowledge, this work can be done if I send a ethernet frame to the dest Mac address ff:ff:ff:ff:ff:ff.

不,这不是它的工作原理。

加入 SSID 类似于将以太网适配器插入物理以太网网络。如果您未通过常规有线以太网适配器接入网络,则无法向该网络上的设备发送数据包。使用 WiFi 适配器,在加入 SSID 之前,您无法与该网络上的其他设备通信。

您的应用程序通常无法访问较低层的 WiFi。有一些 WiFi 适配器可用于调试,允许您侦听和传输任意 802.11a/b/g/n 帧,用于信标、探测器等。 None 这些管理帧用于传输流量。

如果您想在尚未设置为相互通信的一对设备之间发送数据,您应该让它们加入一个 ad-hoc SSID。然后,照常在网络上广播流量。