我正在使用基于以太网的旧协议(特别是BACnet /以太网),因此我正在编写一个应用程序,以使用Go发送和接收以太网帧。我使用的是github上的软件包,到目前为止还不错,并按照here]中的指南进行操作
我正在Linux平台上工作,特别是Debian发行版。 4.14核心。
我可以很好地发送帧,并通过Wireshark确认正在发送它们。我也因此远程设备在Wireshark上回复了我的框架。但是,我的监听功能不会以任何方式处理回复。没有任何类型或错误的输出。
我已经遵循了链接文章中的示例,但是我将在下面提供源代码。这段代码不是我的,我不相信它。它属于Matt Layher
为什么我的申请没有收到答复?
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))
}
我正在使用基于以太网的旧协议(特别是BACnet /以太网),因此我正在编写一个应用程序,以使用Go发送和接收以太网帧。我正在使用来自github的软件包...
发现了我的问题。