Maison >développement back-end >Golang >Ouverture de pfring depuis Go : pfring NewRing Erreur : aucun appareil de ce type

Ouverture de pfring depuis Go : pfring NewRing Erreur : aucun appareil de ce type

王林
王林avant
2024-02-10 17:30:09472parcourir

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

Lors de la programmation réseau, nous rencontrons souvent des erreurs et des exceptions. Parmi eux, le problème « erreur pfring NewRing : aucun périphérique de ce type » qui se produit lors de l'ouverture de la bibliothèque pfring à partir du langage Go est une erreur courante qui tourmente les développeurs. L'éditeur PHP Zimo analysera les raisons et les solutions de cette erreur et vous aidera à résoudre ce problème en douceur.

Contenu de la question

Je souhaite appeler pf_ring depuis le code go en utilisant le package github.com/google/gopacket/pfring mais je n'arrive pas à le faire fonctionner sur Debian 11 (mon code fonctionne sur Debian 10).

Voici mon code de départ :

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

Quand je l'exécute :

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

Apparemment l'interface eno1 existe :

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

Ce qui est bizarre c'est que le même code écrit en c fonctionne aussi :

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

Des idées ?

Solution de contournement

Il s'avère qu'il s'agit d'un bug dans gopacket/pfring, voir Issue #147 et le fix. L'appel de la bibliothèque à pfring_open n'a signalé aucune erreur, mais la bibliothèque a mal interprété le code retour.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer