c++ - 我如何在 C/C++ 中接收原始的第 2 层数据包?

标签 c++ c sockets posix vxworks

我如何在 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;
   _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

最佳答案

我认为做到这一点的方法是编写自己的网络服务,绑定(bind)到 VxWorks 网络堆栈中的 MUX 层。这在 VxWorks 网络程序员指南中有相当详细的记录,我也做过很多次。

自定义网络服务可以配置为使用 MUX_PROTO_SNARF 服务类型查看在网络接口(interface)上接收到的所有第 2 层数据包,这是 Wind River 自己的 WDB 协议(protocol)的工作方式,或者具有特定协议(protocol)类型的数据包。

还可以通过编写位于网络服务和套接字 API 之间的自定义套接字后端,将套接字接口(interface)添加到您的自定义网络服务。如果您乐于在网络服务中处理申请,则不需要这样做。

您没有说您使用的是哪个版本的 VxWorks,但我认为以上内容适用于 VxWorks 5.5.x 和 6.x

关于c++ - 我如何在 C/C++ 中接收原始的第 2 层数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3526819/

相关文章:

c - printf 覆盖看似不相关的数据?

c - C : Data not being sent/received properly? 中的服务器/套接字编程

c++ - 在 C++ 中组织静态数据

c++ - C++ Linux蓝牙sdp_connect仅以root特权成功

C++ 如何实现这个单参数构造函数?

c - C代码的优化

c++ - 出现段错误的最小 C/C++ 程序?

python - 关于是否在 TCP 代理项目中使用 Twisted 的一般问题

c++ - c 套接字以字符串形式发送命令

c++ - 使用 Qt 检查字符串是否是有效的文件名