C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在C/C++中接收原始的第2层数据包?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在POSIXy C中如何接收第二层数据包?数据包只有src和dst MAC地址,类型/长度和自定义格式的数据.他们不是TCP或UDP或IP或IGMP或ARP或其他 – 他们是由五金家伙给我的家庭酿造的格式.

我的套接字(AF_PACKET,SOCK_RAW,IPPROTO_RAW)不会从其recvfrom()返回.

我可以发送正常,我无法接收,无论我在网络堆栈中的什么选项.

(平台是VxWorks,但我可以翻译POSIX或Linux或其他任何…)

接收代码(当前化身):

int s;

 if ((s = socket(AF_PACKET,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,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,sizeof(packet));

   if (recvfrom(s,(char *)packet,sizeof(packet),(struct sockaddr *)&_sockAttrib,&_sockAttribLen) < 0)
   {
      printf("packet receive error.");
   }

   // code never reaches here

解决方法

我认为这样做的方法是编写自己的网络服务,绑定到VxWorks网络堆栈中的MUX层.这在VxWorks网络程序员指南中有相当明确的记录,我已经做了很多次.

可以使用MUX_PROTO_SNARF服务类型(即Wind River自己的WDB协议如何工作)或具有特定协议类型的数据包来配置自定义网络服务以查看网络接口上收到的所有第2层数据包.

还可以通过编写位于网络服务和套接字API之间的自定义套接字后端来为您的自定义网络服务添加套接字接口.如果您很乐意在网络服务中进行应用程序处理,则不需要此操作.

您没有说明您使用的VxWorks版本,但我认为上述适用于VxWorks 5.5.x和6.x

大佬总结

以上是大佬教程为你收集整理的如何在C/C++中接收原始的第2层数据包?全部内容,希望文章能够帮你解决如何在C/C++中接收原始的第2层数据包?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。