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

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日

悬赏问题

  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备