如何在POSIXy C++中接收第2层数据包?数据包只有src和dst MAC地址,类型/长度和自定义格式的数据.它们不是TCP或UDP或IP或IGMP或ARP或其他 - 它们是由硬件人员给我的家庭酿造格式.
我socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)永远不会从它回来recvfrom().
我可以发送罚款,无论我在网络堆栈中使用什么选项,我都无法接收.
(平台是VxWorks,但我可以翻译POSIX或Linux或其他......)
接收代码(当前的化身):
int s;
if ((s = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) < 0) {
printf("socket create error.");
return -1;
}
struct ifreq _ifr;
strncpy(_ifr.ifr_name, "lltemac0", strlen("lltemac0"));
ioctl(s, IP_SIOCGIFINDEX, &_ifr);
struct sockaddr_ll _sockAttrib;
memset(&_sockAttrib, 0, sizeof(_sockAttrib));
_sockAttrib.sll_len = sizeof(_sockAttrib);
_sockAttrib.sll_family = AF_PACKET;
_sockAttrib.sll_protocol = IFT_ETHER;
_sockAttrib.sll_ifindex = _ifr.ifr_ifindex;
_sockAttrib.sll_hatype = 0xFFFF;
_sockAttrib.sll_pkttype = PACKET_HOST;
_sockAttrib.sll_halen = 6;
_sockAttrib.sll_addr[0] = 0x00;
_sockAttrib.sll_addr[1] = 0x02;
_sockAttrib.sll_addr[2] = 0x03;
_sockAttrib.sll_addr[3] = 0x12; …Run Code Online (Sandbox Code Playgroud)