卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章35248本站已运行394

从 Go 打开 pfring:pfring NewRing 错误:没有这样的设备

从 go 打开 pfring:pfring newring 错误:没有这样的设备

在进行网络编程时,我们经常会遇到一些错误和异常情况。其中,从Go语言打开pfring库时出现的"pfring NewRing 错误:没有这样的设备"问题是一个常见的困扰开发者的错误。php小编子墨将为大家解析这个错误的原因和解决方法,帮助大家顺利解决这个问题。

问题内容

我想使用 github.com/google/gopacket/pfring 包从 go 代码中调用 pf_ring,但无法使其在 debian 11 上运行(我的代码在 debian 10 上运行)。

这是我的 go 代码:

package main

import (
    "github.com/google/gopacket/pfring"
    "log"
)

func main() {
    _, err := pfring.newring("eno1@0", 1574, pfring.flagpromisc|pfring.flag(1<<14))
    if err == nil {
        log.printf("success!")
        return
    }
    log.fatalf("failure: %s", err)
}

当我运行它时:

# ./test-go 
2023/01/24 10:12:25 failure: pfring newring error: no such device

显然eno1接口是存在的:

# pf_ringcfg --list-interfaces
name: eno1                 driver: i40e       rss:     12   [supported by zc]
name: enp3s0f1             driver: i40e       rss:     12   [supported by zc]
name: enx0a229512eeb9      driver: cdc_ether  rss:     1    [linux driver]

奇怪的是用 c 编写的相同代码也能工作:

#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <pfring.h>

int main() {
    pfring* ring = pfring_open("eno1@0", 1574, pf_ring_promisc | pf_ring_zc_not_reprogram_rss);
    if (ring != null) {
        printf("success!n");
        exit(0);
    }
    int e = errno;
    char* msg = strerror(e);
    printf("failure %d: %sn", e, msg);
    exit(1);
}
# ./test-c 
Success!

有什么想法吗?

解决方法

事实证明,这是 gopacket/pfring 中的一个错误,请参阅问题 #147 以及修复。该库对 pfring_open 的调用未报告错误,但库错误解释了返回码。

卓越飞翔博客
上一篇: 如何将元素从一个切片移动到另一个切片
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏