IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Fuite mémoire pointeur sur une structure bpf_program


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 44
    Par défaut Fuite mémoire pointeur sur une structure bpf_program
    Bonjour,
    Dans le but de créer un filtre pour filtrer les packets que reçoit mon traffic, j'ai besoin d'un pointeur sur une structure bpf_program, et c'est ici que tout se plante
    voici le code de la méthode que j'utilise
    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
    pcap_t * PacketAfdx::OpenDev(pcap_if_t *alldevs, int inum) //return -1 if error and return 0 else
    {
    	pcap_t *adhandle;
    	pcap_if_t *d;
    	char errbuf[PCAP_ERRBUF_SIZE];
    	int i;
    	for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
     
    	if ( (adhandle= pcap_open(d->name,          // name of the device
                                  65536,            // portion of the packet to capture. 
                                                    // 65536 guarantees that the whole packet will be captured on all the link layers
                                  PCAP_OPENFLAG_PROMISCUOUS,    // promiscuous mode
                                  1000,             // read timeout
                                  NULL,             // authentication on the remote machine
                                  errbuf            // error buffer
                                  ) ) == NULL)
        {
     
            /* Free the device list */
    		//Console::WriteLine("errbuf:%s",errbuf); 
    		cout <<"Le bloccage est ici";
            pcap_freealldevs(alldevs);
     
        }
     
       cout <<"\nlistening on ...\n"<< d->description;
       if(pcap_datalink(adhandle) != DLT_EN10MB)
        {
            fprintf(stderr,"\nThis program works only on Ethernet networks.\n");
     
        }
     
         bpf_u_int32 netmask;
     
       if (d->addresses != NULL)
     
            /* Retrieve the mask of the first address of the interface */
            netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
        else
            /* If the interface is without an address we suppose to be in a C class network */
            netmask=0xffffff; 
     
      struct bpf_program *fcode = (bpf_program *) malloc(sizeof(struct bpf_program));
     
    //compile the filter
        if (pcap_compile(adhandle, fcode, "udp src port 57344", 1, netmask) < 0)
        {
            fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
            /* Free the device list */
     
     
        }
     
    //set the filter
        if (pcap_setfilter(adhandle, fcode) < 0)
        {
            fprintf(stderr,"\nError setting the filter.\n");
            /* Free the device list */
     
     
        }
    	free(fcode);
        /* At this point, we don't need any more the device list. Free it */
        pcap_freealldevs(alldevs);
    	return adhandle;
     
    }
    L'application crach à un moment donné et j'ai comme sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exception de première chance à 0x00436d5c dans App.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xccccccd7.
    Exception non gérée à 0x00436d5c dans App.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xccccccd7.
    J'ai utilisé malloc et free , je ne voit pas pourquoi ça crach, aidez moi s'il vous plait,
    Merci d'avance

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    Si alldevs est NULL ça segfault dans le open.

    adhandle vaut n'importe quoi et donc lors du pcap_datalink(adhandle) ça segfault...

    Et quelques détails :

    Dans ton cas, je trouve que caster le retour du malloc diminue la lisibilité surtout que tu fais un (bpf_program *) alors que c'est struct bpf_program. Enfin si ça marche c'est qu'il y a un typedef et que tu peux enlever le struct partout.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 44
    Par défaut
    Bonsoir,
    alldevs n'est pas null elle m'affiche une interface et commence déjà à afficher le contenu d'un paquet puis elle se crache quand on veut accéder au contenu de la structure ethernet

    voici le main:
    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
    int _tmain(int argc, _TCHAR* argv[])
    {
     PacketAfdx P;
    	 pcap_if_t *alldevs;
    	  pcap_t *ad;
    	  int inum;
     
     
    	 alldevs=P.ChooseDev2();
    	  printf("Enter the interface number ");
        scanf("%d", &inum);
     
     
     
    	ad=P.OpenDev(alldevs,inum,fcode);
    	 P.ParseDataPacket(ad);
    	system("PAUSE");
    	getch();
     
    	return 0;
    }
    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
    76
    pcap_t * PacketAfdx::OpenDev(pcap_if_t *alldevs, int inum,struct bpf_program * fcode) //return -1 if error and return 0 else
    {
    	pcap_t *adhandle;
    	pcap_if_t *d;
    	char errbuf[PCAP_ERRBUF_SIZE];
    	int i;
    	for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
     
    	if ( (adhandle= pcap_open(d->name,          // name of the device
                                  65536,            // portion of the packet to capture. 
                                                    // 65536 guarantees that the whole packet will be captured on all the link layers
                                  PCAP_OPENFLAG_PROMISCUOUS,    // promiscuous mode
                                  1000,             // read timeout
                                  NULL,             // authentication on the remote machine
                                  errbuf            // error buffer
                                  ) ) == NULL)
        {
     
            /* Free the device list */
    		//Console::WriteLine("errbuf:%s",errbuf); 
    		cout <<"Le bloccage est ici";
            pcap_freealldevs(alldevs);
     
        }
     
       cout <<"\nlistening on ...\n"<< d->description;
       if(pcap_datalink(adhandle) != DLT_EN10MB)
        {
            fprintf(stderr,"\nThis program works only on Ethernet networks.\n");
     
        }
     
         bpf_u_int32 netmask;
    	  struct bpf_program *fcode = (bpf_program *) malloc(sizeof(struct bpf_program));
       if (d->addresses != NULL)
     
            /* Retrieve the mask of the first address of the interface */
            netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
        else
            /* If the interface is without an address we suppose to be in a C class network */
            netmask=0xffffff; 
     
     
     
    //compile the filter
        if (pcap_compile(adhandle, fcode, "udp src port 57344", 1, netmask) < 0)
        {
            fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
            /* Free the device list */
     
     
        }
     
    //set the filter
        if (pcap_setfilter(adhandle, fcode) < 0)
        {
            fprintf(stderr,"\nError setting the filter.\n");
            /* Free the device list */
     
     
        }
     
        /* At this point, we don't need any more the device list. Free it */
        pcap_freealldevs(alldevs);
    	return adhandle;
     
    }
     
    void PacketAfdx::print_Eth_header(const struct ether_header * ethernet){
     
    	fprintf(stdout,"-------------------[ETH HEADER]-----------\r\n");
        fprintf(stdout,"| %.2X:%.2X:%.2X:%.2X:%.2X:%.2X -> ",ethernet->ether_shost[0],ethernet->ether_shost[1], ethernet->ether_shost[2],ethernet->ether_shost[3],ethernet->ether_shost[4],ethernet->ether_shost[5]);
        fprintf(stdout,"%.2X:%.2X:%.2X:%.2X:%.2X:%.2X |\r\n",ethernet->ether_dhost[0],ethernet->ether_dhost[1], ethernet->ether_dhost[2],ethernet->ether_dhost[3],ethernet->ether_dhost[4],ethernet->ether_dhost[5]);
        fprintf(stdout,"------------------------------------------\r\n");
    	fprintf(stdout,"Protocol: 0x%.4X\r\n", htons(ethernet->ether_type));
    }
    L'application se crache au niveau de la ligne 72

  4. #4
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    J'ai dit des bêtises dans le post du dessus j'avais pas vu que tu récupérais la valeur du open dans adhandler

    Mais si tu as une segfault à la ligne 72 c'est que ethernet est NULL donc vérifie bien lors de l'appel à cette fonction.

  5. #5
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 44
    Par défaut
    Je voudrais juste vous dire que l'application marche normalement sans l'ajout des filtres elle m'affiche le contenu des packets entrants c'est pour ça j'ai pensé que le problème réside dans la structure bpf_program*

  6. #6
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    tu codes en c++ et tu utilises des pointeurs sans vérifier leur contenu avant utilisation, là où des références seraient peut-être plus appropriées...

    tu retourne un pointeur avec 0 ou -1 dedans au lieu d'un booléen ou d'un int plus approprié? car après tu y colles même une structure... t'as pas l'impression que c'est un peu du n'importe quoi?

    soit tu retournes NULL si il y a un problème soit ta structure...

    ta méthode ParseDataPacket est celle qui pose problème... vu que print_Eth_header n'est jamais appelée dans ton code

    le for multiple, c'est beau mais si tu as un dépassement sur l'un de tes parcours c'est pas top à déboguer...

    stdout est défini où? dans ta classe? en externe dans ton .h ? c'est un tampon assez grand?

    j'ai l'impression que tu as du mal avec les pointeurs...


  7. #7
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Montre un peu le code de P.ParseDataPacket(ad); Voir ta classe en entier, ça sera plus simple pour nous.

    stdout est défini où? dans ta classe? en externe dans ton .h ? c'est un tampon assez grand?
    Non ça c'est bon, c'est juste la sortie standard...

    Par contre c'est pas du C++ que tu fais c'est du C auquel tu rajoutes les classes mais enfin bon.

  8. #8
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 44
    Par défaut
    Bonjour,
    Voici la totalité de la classe PacketAfdx que j'utilise:
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    #include "stdafx.h"
    #include "PacketAfdx.h"
     
     
     
     
     
     
     
    pcap_if_t* PacketAfdx::ChooseDev2(){
     
    		int nbdev;
    		pcap_if_t *d;
    		pcap_if_t *alldevs;
    		// Retrieve the device list on the local machine 
    		nbdev=0;
    		char errbuf[PCAP_ERRBUF_SIZE];
        if (pcap_findalldevs(&alldevs, errbuf) == -1)
    		{
     
     
    		cout<<"Error in pcap_findalldevs";
            exit(1);
    		}
    	for(d=alldevs; d!= NULL;
                    d= d->next)
        {
     
    		cout<<++nbdev<<"."<< d->name;
            if (d->description)
                cout<<" ("<<d->description<<")"<<"\n";
            else
     
    		cout<<" (No description available)\n";
        }
     
    	    if(nbdev==0)
        {
          		cout<<"\nNo interfaces found! Make sure WinPcap is installed.\n";
     
            exit(1);
        }
     
     
    	return alldevs;
     
    }
    PacketAfdx::PacketAfdx()
    {
     
    }
    pcap_t * PacketAfdx::OpenDev(pcap_if_t *alldevs, int inum) 
    {
    	pcap_t *adhandle;
    	pcap_if_t *d;
    	char errbuf[PCAP_ERRBUF_SIZE];
    	int i;
    	for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
     
    	if ( (adhandle= pcap_open(d->name,          // name of the device
                                  65536,            // portion of the packet to capture. 
                                                    // 65536 guarantees that the whole packet will be captured on all the link layers
                                  0,    // promiscuous mode
                                  1000,             // read timeout
                                  NULL,             // authentication on the remote machine
                                  errbuf            // error buffer
                                  ) ) == NULL)
        {
     
            /* Free the device list */
    				cout <<"Le bloccage est ici";
            pcap_freealldevs(alldevs);
     
        }
     
       cout <<"\nlistening on ...\n"<< d->description;
     
       if(pcap_datalink(adhandle) != DLT_EN10MB)
        {
            fprintf(stderr,"\nThis program works only on Ethernet networks.\n");
     
        }
     
        long netmask;
     
       if (d->addresses != NULL)
     
            //Retrieve the mask of the first address of the interface 
            netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
        else
            // If the interface is without an address we suppose to be in a C class network 
            netmask=0xffffff; 
     
     
      struct bpf_program* fcode= (bpf_program *) malloc(sizeof(struct bpf_program));
    //compile the filter
        if (pcap_compile(adhandle, &fcode, "udp src port 57344", 0, netmask) < 0)
        {
            fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
           // Free the device list
     
     
        }
     
    //set the filter
        if (pcap_setfilter(adhandle, &fcode) < 0)
        {
            fprintf(stderr,"\nError setting the filter.\n");
          // Free the device list 
     
     
        }
     
     
     
       // At this point, we don't need any more the device list. Free it 
        pcap_freealldevs(alldevs);
    	return adhandle;
     
    }
     
    void PacketAfdx::print_Eth_header(const struct ether_header * ethernet){
     
    	fprintf(stdout,"-------------------[ETH HEADER]-----------\r\n");
        fprintf(stdout,"| %.2X:%.2X:%.2X:%.2X:%.2X:%.2X -> ",ethernet->ether_shost[0],ethernet->ether_shost[1], ethernet->ether_shost[2],ethernet->ether_shost[3],ethernet->ether_shost[4],ethernet->ether_shost[5]);
        fprintf(stdout,"%.2X:%.2X:%.2X:%.2X:%.2X:%.2X |\r\n",ethernet->ether_dhost[0],ethernet->ether_dhost[1], ethernet->ether_dhost[2],ethernet->ether_dhost[3],ethernet->ether_dhost[4],ethernet->ether_dhost[5]);
        fprintf(stdout,"------------------------------------------\r\n");
    	fprintf(stdout,"Protocol: 0x%.4X\r\n", htons(ethernet->ether_type));
    }
     
    void PacketAfdx::print_ip_header(const struct ip_header * ip){
     
    	fprintf(stdout,"The Network Id is: %.5d | ",ip->saddr.NetId);
    	fprintf(stdout,"The Equipment Id is: %.5d \r\n ",ip->saddr.EquiId);
    	fprintf(stdout,"The Partition Id is: %.5d | ",ip->saddr.PartitionId);
    	fprintf(stdout,"The Virtual Link Id is: %.5d \r\n ",ip->daddr.VL_Identifier);
    	fprintf(stdout,"--------------------[IP HEADER]----------------------\r\n");
    	fprintf(stdout,"| IP header length    : %d * 32 bits = %d bytes      |\r\n",ip->ihl, ip->ihl * 4);
    	//fprintf(stdout,"| IP version      : %.5d | ",ip->version);
    	//fprintf(stdout,"Type of service : %.5d |\r\n",ip->tos);
    	fprintf(stdout,"| Total length    : %.5d | ",htons(ip->tot_len));
    	fprintf(stdout,"Identification  : %.5d |\r\n",htons(ip->Frag_id));
    	fprintf(stdout,"| Time to live    : %.5d | ",ip->ttl);
    	fprintf(stdout,"Protocol        : %.5d |\r\n",ip->protocol);
    	fprintf(stdout,"| Checksum            : %.5d                       |\r\n",ip->check);
    	fprintf(stdout,"------------------------------------------------------\r\n");
    }
     
    void PacketAfdx::print_udp_header(const struct udp_header * udp){
     
     
    	fprintf(stdout,"[ Port : %.5d -> %.5d ]\n", ntohs(udp->source), ntohs(udp->dest) );
    	fprintf(stdout,"--------------------[UDP HEADER]---------------------\r\n");
    	fprintf(stdout,"| Checksum            : %.5d                       |\r\n",udp->udp_cheksum);
    	fprintf(stdout,"| Length              : %.5d                       |\r\n",udp->udp_length);
     
    	fprintf(stdout,"-----------------------------------------------------\r\n");
    }
     
     
    void PacketAfdx::ParseDataPacket(pcap_t *adhandle){
    	const u_char *packet;
        struct pcap_pkthdr *header;  
    	int res;
    	res=3;
     
    	 while(( res = pcap_next_ex( adhandle, &header, &packet)) >= 0){
     
            if(res == 0){
               //Timeout elapsed 
     
    		cout <<"\nLe packet a été bien récupéré\n";
     
    		cout<<"\r\n\r\nPacket length:"<<header->len<<"\r\n";
     
    		cout<< "Received at ....."<<ctime((const time_t*)&header->ts.tv_sec)<<"\r\n";
    			const struct ether_header *ethernet; // The ethernet header 
    			const struct ip_header *ip; // The IP header 
    			const struct udp_header *udp; // The TCP header 
    			char *payload; // Packet payload 
    			u_int size_ip;
    			u_int size_udp;
     
     
    			ethernet = (struct ether_header*)(packet);
    			//Console::WriteLine("Dir Sourc: %d\n", ethernet->ether_type);
     
    			 print_Eth_header(ethernet);
    			ip = (struct ip_header*)(packet + SIZE_ETHERNET);
    			//size_ip = IP_HL(ip)*4;
    			size_ip= ip->ihl * 4;
    			if (size_ip < 20)
     
    		cout<<"   * Invalid IP header length: "<< size_ip<<"bytes\n";
    			print_ip_header(ip);
     
    			udp = (struct udp_header*)(packet + SIZE_ETHERNET + size_ip);
    			size_udp = (int) (udp->udp_length);
    			if (size_udp < 8) 
    		cout<<"   * Invalid UDP header length: "<< size_udp<<"bytes\n";
    		print_udp_header(udp);
    		payload = (char *)(packet + SIZE_ETHERNET + size_ip + size_udp);
    				//Traitement des données
     
     
     
     
     
     
    		}
     
        if(res == -1){
           cerr <<"Error reading the packets:"<<pcap_geterr(adhandle) <<"\n" ;
     
        }
    	 }
     
    }
    Consernant le commentaire se trouvant après la méthode PacketAfdx::OpenDev il s'agit d'un ancien commentaire car cette méthode retournait au début un int (je fais comme meme la différence entre un pointeur sur int et sur une structure )

  9. #9
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 44
    Par défaut
    Pas de & devant fcode dans pcap_compile et pcap_setfilter

  10. #10
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    rebelote dans ce que j'ai dit: ON N'UTILISE JAMAIS UN POINTEUR SANS LE TESTER UN MINIMUM...

    ça enlève 80% de segment fault...

    tu mélanges allègrement des écriture c et c++ en te balladant avec des struct dans ton code alors qu'en c++ le nommage du type est automatique...
    de même:

    je viens de trouver ton code en version non afx: ici

    dans PacketAfdx:arseDataPacket, tu as un problème qui doit être lié à l'utilisation de const sur la déclaration packet

    const oblige à l'initialisation de ta variable lors de la déclaration... sauf quand il s'agit de passage de paramètre car cela remplace l'utilisation des références constante quand on utilise un pointeur constant comme paramètre...

    du coup, je pense que ça crash la fonction pcap_next_ex

    essaye avec:

    et même combat pour tous les autres à mon avis...

    faut se méfier des codes trouvé sur internet... même parfois sur des sites "sérieux"... on est jamais à l'abri d'une erreur

    pour une question de clarté et d'efficacité du code on met toujours les déclaration en début de bloc de code... ça évite, là encore, bien des mauvaises surprises...


  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    faut se méfier des codes trouvé sur internet... même parfois sur des sites "sérieux"...
    Du code C++ comme ça, ça ne se récupère même pas. C'est une telle horreur sans nom que je ne suis pas surpris que cela fuit de partout !!!

    Il existe une interface C++ (http://libpcappp.sourceforge.net/) qui permet probablement d'être dans un contexte + safe.
    A titre d'exemple, en reprenant ligne par ligne les 2 premières fonctions (no comment), avec l'interface C++, toutes les allocations hasardeuses disparaissent (merci le RAII) :
    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
    void PacketAfdx::ChooseDev2(std::vector<pcappp::Device> &devices)
    {
       devices = pcappp::Device::find_all();
       if(devices.size()==0)
       {
          throw std::runtime_error("No interfaces found! Make sure WinPcap is installed.");
       }
       std::for_each(
          devices.begin(),
          devices.end(),
          [](pcappp::Device const&dev)
          {
             std::cout<<dev.get_name()<<"(";
             if(dev.get_description().size()>0)
             {
                std::cout<<dev.get_description();
             }
             else
             {
                std::cout<<"No description available"
             }
             std::cout<<")\n";
          }
       );
    }
     
    std::unique_ptr<pcappp::PcapLive> PacketAfdx::OpenDev(std::vector<pcappp::Device> &all_devices, int inum)
    {
       pcappp::Device const& device = all_devices[inum];
       std::unique_ptr<pcappp::PcapLive> capture(new pcappp::PcapLive(device.get_name(),MAX_SNAPLEN,false,1000));
     
       std::cout <<"\nlistening on ...\n"<< device.get_description();
     
       if(capture.get_datalink()!=pcappp::EN10MB)
       {
          std::cerr<<"\nThis program works only on Ethernet networks.\n";
       }
     
       long const netmask = (device.get_addresses().size()>0)?
            (device.get_addresses()[0].get_netmask()->sin_addr.S_un.S_addr)
            :0xffffff
       ;
     
       capture.set_filter("udp src port 57344",false,netmask);
    	return capture;
     
    }
    //etc....

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/03/2014, 09h56
  2. Réponses: 2
    Dernier message: 09/03/2014, 23h10
  3. tableau de pointeur sur une structure ?
    Par latitude38 dans le forum C
    Réponses: 8
    Dernier message: 17/01/2011, 18h58
  4. Pointeur sur une structure
    Par youssef222 dans le forum Débuter
    Réponses: 7
    Dernier message: 21/04/2008, 08h00
  5. Pointeur sur une structure
    Par Fred.77 dans le forum C
    Réponses: 19
    Dernier message: 11/11/2007, 13h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo