go - Go 无法接收以太网帧

标签 go ethernet

我正在使用基于以太网的旧协议(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/

相关文章:

转到 XML 错误 : invalid character entity

go - 如何构建多语言存储库以与 golang 合理配合?

qt - 通过 Wifi 的简单 TCP 通信太慢(秒延迟)?

c++ - 我可以用 C++ 编写基于以太网的网络程序吗?

networking - iPhone/Android响应ARP请求的策略是什么

networking - 在 Windows 上以编程方式检测连接的网络速度

json - 两个 Api 调用,具有不同的 JSON 响应。如何将它们输入到不同的结构中,但在 Golang 中重新排列它们几乎相同?

pointers - 范围引用而不是值

go - 如何访问 Structs 内部的 map ?不能获取 g.vertexes[base] 的地址

c - Microplax 应用中的 Lwip 缓冲区