用于通过 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。然后,照常在网络上广播流量。
我想要 运行 一个程序,用于通过 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。然后,照常在网络上广播流量。