我正在使用基于以太网的旧协议(protocol)(特别是 BACnet/以太网),因此我正在编写一个应用程序来使用 Go 发送和接收以太网帧。我正在使用来自 github 的一个包,它到目前为止非常好,并按照位于 here 的指南进行操作。
我正在使用 Linux 平台,特别是 Debian 发行版。 4.14 内核。
我可以很好地发送帧并使用 Wireshark 验证它们正在发送。我也让远程设备回复我在 Wireshark 上的帧。但是,我的监听功能不会以任何方式处理回复。没有任何类型的输出或错误。
我已经按照链接文章中的示例进行了操作,但我将在下面提供源代码。这段代码不是我的,我不相信它。它属于马特·莱赫
为什么我的申请没有收到回复?
package main
import (
"log"
"github.com/mdlayher/ethernet"
"github.com/mdlayher/raw"
"net"
)
func main {
// Select the eth0 interface to use for Ethernet traffic.
ifi, err := net.InterfaceByName("eth0")
if err != nil {
log.Fatalf("failed to open interface: %v", err)
}
// Open a raw socket using same EtherType as our frame.
c, err := raw.ListenPacket(ifi, 0xcccc)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
defer c.Close()
// Accept frames up to interface's MTU in size.
b := make([]byte, ifi.MTU)
var f ethernet.Frame
// Keep reading frames.
for {
n, addr, err := c.ReadFrom(b)
if err != nil {
log.Fatalf("failed to receive message: %v", err)
}
// Unpack Ethernet frame into Go representation.
if err := (&f).UnmarshalBinary(b[:n]); err != nil {
log.Fatalf("failed to unmarshal ethernet frame: %v", err)
}
// Display source of message and message itself.
log.Printf("[%s] %s", addr.String(), string(f.Payload))
}
最佳答案
发现了我的问题。
当您设置要监听的套接字时,您必须指定以太网帧类型。
在 C 中,这将链接回 linux/if_ether.h 中的帧类型。
如果我指定帧类型 0x0003,它适用于 BACnet/以太网帧,我可以看到帧进入。
关于go - Go 无法接收以太网帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59460097/