zhiyaormb 2024-01-07 16:17 采纳率: 25%
浏览 12
已结题

NPCAP发送数据包的FCS出错

npcap组数据包,类似EtherCAT的简化的协议,组包发送,接到PC上用wireshark抓包,发过去的数据包是正常的(但wireshark里面看不到前导段和FCS段,所以不能确定这两部分是否正确),但接目标板,发现FCS一直是4个字节的0xf0,校验不通过。目标板是一直在用的,所以应该不是目标板接收造成的问题。
初始化过程大体是这样的:
先枚举网卡:

if (pcap_findalldevs(&alldevs, errbuf) == -1)
   {
      fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf);
      return (NULL);
   }
   /* Iterate all devices and create a local copy holding the name and
    * description.
    */
   for(d= alldevs; d != NULL; d= d->next)
   {
      adapter = (ec_adaptert *)malloc(sizeof(ec_adaptert));
      /* If we got more than one adapter save link list pointer to previous
       * adapter.
       * Else save as pointer to return.
       */
      if (i)
      {
         prev_adapter->next = adapter;
      }
      else
      {
         ret_adapter = adapter;
      }

      /* fetch description and name of the device from libpcap */
      adapter->next = NULL;
      if (d->name)
      {
         strncpy(adapter->name, d->name, EC_MAXLEN_ADAPTERNAME);
         adapter->name[EC_MAXLEN_ADAPTERNAME-1] = '\0';
      }
      else
      {
         adapter->name[0] = '\0';
      }
      if (d->description)
      {
         strncpy(adapter->desc, d->description, EC_MAXLEN_ADAPTERNAME);
         adapter->desc[EC_MAXLEN_ADAPTERNAME-1] = '\0';
      }
      else
      {
          adapter->desc[0] = '\0';
      }
      prev_adapter = adapter;
      i++;
   }
   /* free all devices allocated */
   pcap_freealldevs(alldevs);

然后C#层做的UI,界面上手动选择网卡,并打开,底层C++:

*psock = pcap_open(ifname, 65536, PCAP_OPENFLAG_PROMISCUOUS |
                                     PCAP_OPENFLAG_MAX_RESPONSIVENESS |
                                     PCAP_OPENFLAG_NOCAPTURE_LOCAL, -1, NULL , errbuf);
   if (NULL == *psock)
   {
      printf("interface %s could not open with pcap\n", ifname);
      return 0;
   }

网卡正常打开。
最后用pcap_sendpacket发数据包,数据包发送出去的也是正确的,但是FCS这部分却是4字节的0xf0。
这个过程其实和SOEM的windows处理类似,用SOEM编译的windows上的exe,发出去的FCS却是可以的(我前面说的用wireshark抓包判断我发的数据包是否正确,也是对比的SOEM发出去的数据包,而且SOEM发的这个数据包FCS就是正确的)。不同是SOEM用的X86编译的winpcap的lib,我这个用的X64编译的,且用的NPCAP的lib。
翻遍了NPCAP的官方文档,只一处提到了FCS,且只说是自动生成的,没有说手动添加的方法。请问是什么原因导致FCS只填充了一些0xf0进去?如何改正?谢谢

  • 写回答

18条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-01-07 16:20
    关注
    获得0.45元问题酬金

    引用GPT3.5和答主提供,仅供参考:

    根据您提供的信息,NPCAP发送数据包的FCS出错。这可能是由于在您的C++代码中没有正确处理FCS部分导致的。您可以尝试以下方法来解决这个问题:

    1. 检查您的C++代码中是否正确处理了FCS部分。确保在发送数据包之前和之后,FCS部分的值是正确的。您可以使用Wireshark或其他抓包工具来验证这一点。

    2. 如果问题仍然存在,您可以尝试使用其他库或工具来发送数据包,以排除NPCAP库本身的问题。例如,您可以尝试使用libpcap库或WinPcap库来发送数据包,看看是否仍然出现FCS错误。

    3. 如果上述方法都无法解决问题,您可以考虑向NPCAP的开发者报告此问题,并提供详细的测试环境和错误信息。这将有助于他们更好地了解问题所在,并为您提供解决方案。

    评论

报告相同问题?

问题事件

  • 系统已结题 1月15日
  • 创建了问题 1月7日

悬赏问题

  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误