我正在研究编写 Go 的 Ethercat 大师。底层库位于http://github.com/distributed/ecat并包含一个链接级驱动程序,使用 UDP 和多播。我很难让这个链接级驱动程序在多个平台(OS X、Windows、Linux)和不同的网络配置上一致地工作。
对于那些不熟悉 Ethercat 的人,这里是它的工作原理。Ethercat 是一种基于以太网的工业总线系统。有一个总线主机和可能有许多从机,它们连接成一个逻辑环。主机可以由现成的硬件构建,即使用普通的以太网接口卡。主设备在其以太网接口上发送一个数据包,从设备动态修改数据包,在通过所有从设备后,主设备在发送它的同一网络接口上接收数据包。根据从属设备的数量,网络接口可能会在它仍在传输相同的数据包时开始接收数据包。Ethercat 帧有两种可能的格式。第一个是具有特殊以太网类型的以太网数据包。第二个是发往端口 0x88a4 的 UDP 数据包。
根据以太网数据包中包含的命令,从设备可能会也可能不会修改数据包的 Ethercat 数据。除了更改 Ethercat 数据之外,唯一更改的数据包是以太网目标地址的第 1 位设置为 1。数据包的 IP 标头不会被 Ethercat 从站触及。
我的代码工作如下。我加入了一个多播组,比如239.255.65.10
在 interface 上xyz
,我连接了我的 Ethercat 从站。为了与总线交换数据,我发送了一个数据包,让我们pA
在这个接口上调用它239.255.65.10
。操作系统填写源地址,比如192.168.5.2
接口的IP地址xyz
。在数据包通过总线并可能被更改后,它现在是 packet pB
。IP 标头仍然有一个来源192.168.5.2
和一个目的地239.255.65.10
。根据主机的网络设置,此数据包可能会或可能不会到达我的应用程序。在它没有到达我的应用程序的情况下,说什么时候rp_filter
设置,在 Linux 上,数据包pB
被拒绝,因为它看起来像是来自我的机器,但我们不应该通过网络接收我们自己的数据包。
我可以采取哪些步骤来可靠地接收处理后的数据包pB
?请注意,我不是在谈论环回- 环回是关于接收数据包pA
,我的问题是关于接收pB
。