Forum Programmation.c++ Libnids

Posté par  .
Étiquettes : aucune
0
29
avr.
2007
Bonjour à tous,

Voila je teste la libnids pour un travail que je dois rendre.

Mais j'ai un petit probleme avec. Je m'explique : quand je compile cette source avec la commande : `g++ -c nids.cc -o nids -lnids -lpcap -lnet`

j'obtiens cette erreur :

nids.cc: Dans function « int main() »:
nids.cc:37: error: conversion invalide de « void (*)(tcp_stream*, void**) »
vers « void* »

voici mon code alégé pour juste se concentrer sur l'erreur :

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#include <string.h>
#include <stdio.h>
#include <nids.h>

#define int_ntoa(x) inet_ntoa(*((struct in_addr *)&x))

void callback (struct tcp_stream *ts, void **param);

void callback (struct tcp_stream *ts, void **param)
{

return;
}

int main ()
{
if (!nids_init ())
{
fprintf(stderr,"%s\n",nids_errbuf);
return -1;
}
nids_register_tcp(callback);
nids_run ();
return 0;
}

donc voila mon probleme.
Je vous cache pas que c'est le squelette de l'exemple du man qui est lui en c mais je vois pas pourquoi il pourrait pas se compiler en c++, mais je suis pas un expert non plus en c,c++
Merci d'avance pour votre aide.
  • # Cast

    Posté par  . Évalué à 1.

    Essaie ceci :
    nids_register_tcp ((void *) callback);
    • [^] # Re: Cast

      Posté par  . Évalué à 1.

      merci comme ceci ca compile sans probleme, je savais pas qu'on pouvait caster une methode.
      Merci à toi barnabé.
      • [^] # Re: Cast

        Posté par  . Évalué à 2.

        J'ajoute que la bibliothèque a l'air, à priori, d'avoir été salement écrite ! Extrait de nids.h :

        int nids_init (void);
        void nids_register_ip_frag (void (*));
        void nids_register_ip (void (*))
        void nids_register_tcp (void (*));
        void nids_register_udp (void (*));
        void nids_killtcp (struct tcp_stream *);


        Si cette fonction attend une fonction de callback, il me semble qu'elle n'attend rien d'autre et dans ce cas, le développeur aurait pu se fendre de faire le prototype d'un pointeur de fonction correct ! Ce raccourci t'oblige à introduire une ânerie dans ton code, pourtant propre à l'origine ...

        Ceci dit, même avec une bibliothèque correcte, tu aurais peut-être rencontré des ennuis dus au fait que le C++ décore les symboles de fonctions, principalement pour assurer les mécanismes de surcharge. Dans ce cas, il aurait fallu placer ton prototype dans un extern "C" { } ...
  • # autre petit probleme

    Posté par  . Évalué à 1.

    Merci à tous pour vos réponses.
    J'ai un deuxieme probleme de compilation que j'arrive lui non plus à resoudre.
    Lors de la compilation il ne trouve pas les fonctions de libnids !!!

    je compile avec les commande suivante :

    g++ -c nids.c
    g++ -o nids nids.o -lnids -lpcap -lnet

    Erreur :

    nids.o(.text+0x7b): In function `main':
    : undefined reference to `nids_init()'
    nids.o(.text+0xc8): In function `main':
    : undefined reference to `nids_register_ip(void*)'
    nids.o(.text+0xd4): In function `main':
    : undefined reference to `nids_register_udp(void*)'
    nids.o(.text+0xe0): In function `main':
    : undefined reference to `nids_register_tcp(void*)'
    nids.o(.text+0xe5): In function `main':
    : undefined reference to `nids_run()'
    collect2: ld a retourné 1 code d'état d'exécution

    Mon code est le meme que celui d'avant avec des améiorations.
    Donc voila j'ai passé tout l'aprem hier à essayer de comprendre pourquoi ... Donc apres tout ça ben je vois pas du tout pourquoi.

    Mais ce qui est bizard c'est que qu'en je le compille avec gcc ça marche !!!

    Enfin bon si quelqu'un a une idée .?
    • [^] # Re: autre petit probleme

      Posté par  . Évalué à 1.

      si tu arrive a le compiler l'ajout du mot clé "extern C" autour du fichier d'inclusion devrait résoudre ton problème

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.