在进行网络编程时,我们经常会遇到一些错误和异常情况。其中,从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
的调用未报告错误,但库错误解释了返回码。