Как получить пакеты уровня 2 в POSIXy С++? Пакеты имеют только 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;
   _sockAttrib.sll_addr[4]  = 0x34;
   _sockAttrib.sll_addr[5]  = 0x56;
   int _sockAttribLen = sizeof(_sockAttrib);
 char packet[64];
 memset(packet, 0, sizeof(packet));
   if (recvfrom(s, (char *)packet, sizeof(packet), 0,
                (struct sockaddr *)&_sockAttrib, &_sockAttribLen) < 0)
   {
      printf("packet receive error.");
   }
   // code never reaches here
