Bonjour,
je vais essayer de résumer le plus possible.

Je suis un débutant avec GTK, j'ai décider de créer une interface graphique pour mon programme (c'est système de détection d'intrusion réseau).
Avant mon programme fonctionne comme ça:

./nids -i wlan0 -f "dst port 80" > ce qui veut dire que l'interface réseau pour la capture de paquet est (wlan0) doit capturer seulement les paquets à destination du port 80 ...
Par la suite, s'il y a correspondance entre une signature dans la BDD avec celle dans un paquets, il y aura une alerte, journalisation (syslog) et notification par SMS (pour l'admin)...

Maintenant, j'ai 4 menus:

+Fichier
+Capture
+Signatures
+Notifications

Dans le menu Capture j'ai:
+Capture
-Démarrer
-Arrêter
-Options
-Quitter

>>Se qu'il faut faire:
Quant je clique sur Démarrer, une fonction callback (got_packet) doit looper, dès qu'elle reçoit un paquet elle l'affiche à l'écran. Quand j'appuie sur Arrêter la capture s'arrête.

>>Se que j'ai:
Quant j'appuie sur Démarrer, la fonction callback s'exécute pendant 3 secondes puis la fenêtre devient grisâtre (le programme se plante)

J'ai commencer à chercher sur google, j'ai trouver que peut être que c'est un problème de rafraichissement de la fenêtre pendant l'exécution de la fonction callback ou bien par ce GTK utilise une boucle sans fin, il faut demander à Glib d'ajouter une fonction à la boucle des évènements grâce à la fonction: g_idle_add(GSourceFunc function, gpointer data);

J'ai essayer d'implémenter ceci dans le code, j'ai pas réussi

Normalement c'est la fonction callback(got_packet) qui bloque le programme, j'ai ajouter
--
while (gtk_events_pending () )
gtk_main_iteration ()
--
mais ça n'a pas marché !

J'attends avec impatience vos remarques et votre aide

interface.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
 
void OnDemarrer(GtkWidget* widget, gpointer data)
{
   g_idle_add(nids_main,NULL);
}
nids.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
void nids_main()
{

   char errbuf[PCAP_ERRBUF_SIZE];
   char * filter = NULL;
   char * device = NULL;
   int    dump = 0;
   int promisc = 0;

   bpf_u_int32 net = 0;
   bpf_u_int32 mask = 0;

   if (pcap_lookupnet(device, &net, &mask, errbuf) == -1)
      {
         printf("Une erreur a ete detectee: %s\n", errbuf);
      }
      else
      {
         char ip_fmt[INET_ADDRSTRLEN];

         printf("Reseau: %s\n", inet_ntop(AF_INET, &net,  ip_fmt, sizeof ip_fmt));
         printf("Masque: %s\n", inet_ntop(AF_INET, &mask, ip_fmt, sizeof ip_fmt));

         /* Obtenir un descripteur de capture de paquet */
         pcap_t * handle = pcap_open_live(device, SNAP_LEN, 1, 1000, errbuf);

         if (handle == NULL)
         {
            fprintf(stderr, "Erreur ouverture %s: %s\n", device, errbuf);
         }
         else
         {
            	pcap_dumper_t *dumpdesc[] =
               {
                  pcap_dump_open(handle, "tcp.cap"),
                  pcap_dump_open(handle, "udp.cap"),
                  pcap_dump_open(handle, "icmp.cap"),
                  //pcap_dump_open(handle, "ip.cap")
               };

               if(filter != NULL)
               {

                  struct bpf_program fp;

                  if (pcap_compile(handle, &fp, filter, 0, net) == -1) /* Compiler l'expression filtre */
                  {
                     fprintf(stderr, "Verifier l'expresion filtre %s: %s\n", filter, pcap_geterr(handle));
                  }
                  else
                  {
                     if (pcap_setfilter(handle, &fp) == -1) /* Appliquer le filtre */
                     {
                        fprintf(stderr, "erreur lors de l'application du filtre %s: %s\n", filter, pcap_geterr(handle));
                     }

                     pcap_freecode(&fp);
                  }
               }

               pcap_loop(handle, -1, got_packet, (u_char *) dumpdesc);

	           size_t i;
               for (i = 0; i < sizeof dumpdesc / sizeof *dumpdesc; i++)
               {
                  pcap_dump_close(dumpdesc[i]), dumpdesc[i] = NULL;
               }

               puts("\nCapture termine.");
               pcap_close(handle), handle = NULL;
         }

       }
}
J'attends vos remarques

Merci