Heim > Backend-Entwicklung > Golang > Ö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

王林
Freigeben: 2024-02-10 17:30:09
nach vorne
476 Leute haben es durchsucht

从 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)
}
Nach dem Login kopieren

Wenn ich es ausführe:

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

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]
Nach dem Login kopieren

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);
}
Nach dem Login kopieren
# ./test-c 
Success!
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage