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进去?如何改正?谢谢