Heim  >  Artikel  >  Backend-Entwicklung  >  Öffnen von pfring von Go aus: pfring NewRing Fehler: Kein solches Gerät

Öffnen von pfring von Go aus: pfring NewRing Fehler: Kein solches Gerät

王林
王林nach vorne
2024-02-10 17:30:09423Durchsuche

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

Bei der Netzwerkprogrammierung stoßen wir häufig auf Fehler und Ausnahmen. Unter anderem ist das Problem „pfring NewRing error: No such device“, das beim Öffnen der pfring-Bibliothek aus der Go-Sprache auftritt, ein häufiger Fehler, der Entwickler plagt. Der PHP-Editor Zimo analysiert die Gründe und Lösungen für diesen Fehler und hilft Ihnen, dieses Problem reibungslos zu lösen.

Frageninhalt

Ich möchte pf_ring vom Go-Code aus mit dem Paket github.com/google/gopacket/pfring aufrufen, kann es aber nicht unter Debian 11 ausführen (mein Code läuft unter Debian 10).

Das ist mein Go-Code:

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)
}

Wenn ich es ausführe:

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

Anscheinend existiert die eno1-Schnittstelle:

# 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]

Das Seltsame ist, dass derselbe in C geschriebene Code auch funktioniert:

#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: %s\n", e, msg);
    exit(1);
}
# ./test-c 
Success!

Irgendwelche Ideen?

Workaround

Es stellt sich heraus, dass es sich um einen Fehler in gopacket/pfring handelt, siehe Issue #147 und den Fix. Der Aufruf der Bibliothek an pfring_open meldete keinen Fehler, aber die Bibliothek hat den Rückkehrcode falsch interpretiert.

Das obige ist der detaillierte Inhalt vonÖffnen von pfring von Go aus: pfring NewRing Fehler: Kein solches Gerät. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen