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

Réseau C Discussion :

wake on lan & paquet magic


Sujet :

Réseau C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 28
    Par défaut wake on lan & paquet magic
    Bonjour,
    N'ayant pas touché au C depuis mon bts (qui a déjà quelque années maintenant ) je me remet dans le bain pour tenter de faire un prog de wol.
    Après quelques galères, les réflexes reviennent petit a petit et le script en soi est relativement simple.
    Je me suis inspiré de différents bouts de code trouvés a droite, a gauche sur le net mais je bloque sur la création du paquet magic.

    voici le code :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <winsock2.h>
     
    int main(int argc, char *argv[])
    {
        WSADATA wsaData;
        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
            fprintf(stderr, "La fonction WSAStartup a echoue.\n");
        else
        {
            /* ... initialisation de la socket ... */
            SOCKET s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
     
            if (s == INVALID_SOCKET)
                fprintf(stderr, "La fonction socket a echoue.\n");
            else
            {
                char mac[20];
                char data[102];
                int i, tampon, a, b;
                int errmac = 0;
     
                /* ... récupération de l'adresse mac ... */
                printf("entrer l'adresse mac du pc a demarrer :\n");
                fgets(mac, sizeof mac, stdin);
                char *p = strchr(mac, '\n');
                if(p)
                   *p = 0;
     
                /* ... vérification de l'adresse mac ... */
                if (strlen(mac)!=12) 
                   errmac=1; 
                else 
                {
                     for (i=0;i<(int)strlen(mac);i++) // Boucle parcourrant les caracteres saisis
                     {
                         if ((int)(mac[i])>=97&&(int)(mac[i])<=102) // Convertion des minuscules en majuscules
                         mac[i]=mac[i]-32;
                         if ( ((int)(mac[i])>=48&&(int)(mac[i])<=57)==FALSE ){ // Si ce n'est pas un nombre
                            if ( ((int)(mac[i])>=65&&(int)(mac[i])<=70)==FALSE ) // Si ce n'est pas l'une des 6 premières lettres
                               errmac = 1;
                         }
                     }
                }
     
                if(errmac)
                          fprintf(stderr, "adresse mac non valide.\n");
                else
                {
                    /* ... création du paquet magic ... */
                    for (i=0;i<6;i++)
                         data[i] = 0xff;
     
                    for (i=0;i<12;i=i+2)
                    {
                        a = (int) strtol(&mac[i], NULL, 16);
                        b = (int) strtol(&mac[i+1], NULL, 16);
                        tampon = a*0x10 + b;
                        memcpy(&data[i+6],&tampon,1);
                    }
     
                    for (i=0;i<15;i++) 
                        memcpy(&data[(i+2)*6],&data[6],6);
     
                    /* ... définition du destinataire ... */
                    SOCKADDR_IN dest;
     
                    dest.sin_family       = AF_INET;
                    dest.sin_addr.s_addr  = inet_addr("255.255.255.255"); // adresse de broadcast 
                    dest.sin_port         = htons(7);
                    memset(&dest.sin_zero, '\0', sizeof(dest.sin_zero));
     
                    /* ... envoi du paquet ... */
                    if(sendto(s, data, 102, 0, (SOCKADDR *)&dest, sizeof(dest)) <= 0);
                                 fprintf(stderr, "erreur a l'envoi du paquet.\n");                    
     
                    closesocket(s);
                }
            }
     
            /* ... libération de la dll winsock ... */
            WSACleanup();
        }	
        return 0;
    }
    j'ai l'impression que le problème vient plus précisément de mon appel a strol car quand je debug, les valeurs retourné dans a et b ne correspondent a rien d'identifiable et surtout pas a l'adresse mac rentré a la base.
    Donc si quelqu'un a des expliquation a me donner (voir une solution ), je suis preneur.

    2e chose :
    Je ne suis peut-être pas dans la bonne section mais sa m'évitera un 2e post.
    Existe-t-il un moyen de récupérer l'adresse mac d'un pc du réseau a partir du nom netbios (via wins ou dhcp ou autre) sans que celui-ci soit allumé bien entendu?

    PS: comme précisé plus haut, cela fait longtemps que je n'ai pas codé en c même si l'analogie avec le php (que je connais mieux) est facile, donc n'hésitez pas à me conseiller sur ma façon de coder si je sort des ineptie de codeur amateur dans mon prog.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 501
    Par défaut
    Citation Envoyé par kennylafougere Voir le message
    j'ai l'impression que le problème vient plus précisément de mon appel a strol car quand je debug, les valeurs retourné dans a et b ne correspondent a rien d'identifiable et surtout pas a l'adresse mac rentré a la base.
    J'ai l'impression aussi.

    strtol() est une fonction qui transforme une chaine de caractères en nombre. Toi, ce que tu veux faire, c'est transformer un caractère en nombre et ce n'est pas la même chose.

    Il te faut créer une fonction (très simple) et utiliser cette fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int char2int(const char Val)
    {
       if( (Val >= '0') && (Val <= '9') )
          return Val - '0';
     
       if( (Val >= 'a') && (Val <= 'f') )
          return Val - 'a' + 10;
     
       if( (Val >= 'A') && (Val <= 'F') )
          return Val - 'A' + 10;
     
       /* mauvais caractère */
       return -1;
    }
    Autre chose, les valeurs magiques comme 97 ou 102, vaut mieux éviter et mettre 'a' ou 'f', c'est plus facile à lire.

    Citation Envoyé par kennylafougere Voir le message
    Existe-t-il un moyen de récupérer l'adresse mac d'un pc du réseau a partir du nom netbios (via wins ou dhcp ou autre) sans que celui-ci soit allumé bien entendu?
    Pas à ma connaissance
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 28
    Par défaut
    effectivement sa a l'air déjà plus cohérent comme sa même si je ne pourrais en être vraiment sûr qu'apres capture de la trame envoyé sur le réseau par contre je me retrouve avec une erreur sur le sendto() et un errno=0

    ps : j'ai pensé a inclure errno.h

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 501
    Par défaut
    Un point virgule à la fin de la clause if et cela fout en l'air pas mal de choses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(...) ;
    printf(...)
    Le printf est toujours exécuté car si le test est vrai, c'est le ";" qui est exécuté (c'est à dire rien)


    Au fait, pourquoi un buffer de 102 octets.

    Ton sendto contient une autre valeur magique (102). Ce serait mieux comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(sendto(s, data, sizeof(data), 0, (SOCKADDR *)&dest, sizeof(dest)) <= 0)/* ; pas de ; ici */
    {
       fprintf(stderr, "erreur a l'envoi du paquet (%d).\n", errno);
    }
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 28
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Un point virgule à la fin de la clause if et cela fout en l'air pas mal de choses
    effectivement l'erreur de base

    Citation Envoyé par ram-0000 Voir le message
    Au fait, pourquoi un buffer de 102 octets.
    parce que c'est pile la taille de la trame a envoyer (au moins je suis sur de pas envoyer d'octets en trop)

    par contre, correction faite le sendto() est toujours en erreur avec errno = 0

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 28
    Par défaut
    bon la je commence vraiment a sécher, perror ne m'affiche pas d'erreur non plus.

    voici un condensé du code qui pause pb :
    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
     
    /* ... initialisation de la dll winsock ... */
        WSADATA wsaData;
        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
            fprintf(stderr, "La fonction WSAStartup a echoue.\n");
        else
        {
            /* ... initialisation de la socket ... */
            SOCKET s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
     
            if (s == INVALID_SOCKET)
                fprintf(stderr, "La fonction socket a echoue.\n");
     
             /* ... définition du destinataire ... */
             SOCKADDR_IN dest;
     
             dest.sin_family       = AF_INET;
             dest.sin_addr.s_addr  = inet_addr("255.255.255.255"); 
             dest.sin_port         = htons(7);
             memset(&dest.sin_zero, '\0', sizeof(dest.sin_zero));
     
              /* ... envoi du paquet ... */
              int ret = sendto(s, data, sizeof(data), 0, (SOCKADDR *)&dest, sizeof(dest));
              if(ret < 0)
              {
                    fprintf(stderr,"Error %d in sendto: %s\n",errno,sys_errlist[errno]);
                    perror("sendto");
               }
     
               closesocket(s);
         }
    sortie => Error 0 in sendto: No error
    sendto: No error

    je me dis que ce qui a le plus de chance de générer une erreur est dest mais tout me semble correct.
    De plus le contrôle d'erreur qui ne detect rien est très bizarre

    WTF

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 501
    Par défaut
    As tu regardé la trame qui part avec Wireshark par exemple ?

    Est ce que cette trame est cohérente par rapport à ce que tu veux envoyer (au moins les entêtes IP et UDP) ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 501
    Par défaut
    Je viens de reproduire ton bug et de le corriger par la même occasion. Quelques modifications dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
    ...
    dest.sin_addr.s_addr  = inet_addr("192.168.1.255");
    192.168.1.x est mon réseau local

    Je pense que tu ne peux pas envoyer à 255.255.255.255 (ou que tu n'as pas le droit, il faudrait peut être être admin, je n'en sais rien). Il te faut donc calculer ton réseau local et ensuite calculer ton adresse de broadcast.

    Ensuite, le paquet part bien, je l'ai vu avec Wireshark
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 28
    Par défaut
    Bon sa avance !
    Suite a ta correction, le sendto() fonctionne et après un peu de baston avec les filtres wireshark (1ere réelle utilisation) j'ai réussi a capturer le paquet transmis par contre bizarrement il voit ça comme un protocole ECHO au lieu de UDP (broadcast ?).
    Maintenant j'ai un souci dans la trame envoyée ou chaque octet de la partie 16*MacAddr est espacé par 00 (genre XX00XX00XX00...) mais je pense que c'est une broutille vue le chemin parcouru.
    je continu a chercher en tous cas un grand merci pour ton aide ram-0000.

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 501
    Par défaut
    Citation Envoyé par kennylafougere Voir le message
    Bpar contre bizarrement il voit ça comme un protocole ECHO au lieu de UDP (broadcast ?).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dest.sin_port         = htons(7);
    Normal, tu l'envoies sur le port 7. Le port 7, c'est le protocole echo (comme le dit Wireshark). Par contre l'adresse est bien une adresse de broadcast (local)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 28
    Par défaut
    Cette fois si la trame est corrigée et j'ai comparé une capture de paquet avec celle d'un programme fonctionnel.

    1 : Au lieu d'envoyer 1 paquet, 128 partent avec la même adresse source.
    Pourquoi n'est-ce pas le routeur qui redistribue ?

    2 : Mon 1er paquet (l'original je suppose) à un header checksum faux (0x0000)
    je pensais que cette partie était prise en charge par les socket via l'encapsulation a partir du moment ou on défini le protocole a utiliser.
    Y a-t-il un paramétrage supplémentaire a faire?

    3 : Le prog qui fonctionne réussi a utiliser l'adresse de broadcast 255.255.255.255.
    Les sources trouvées sur le net qui fonctionnent comme sa utilisent les raw sockets y a-t-il un rapport ?
    D'autant plus que j'avais cru comprendre que les raw socket étaient désactivés sur xp sp2.

    PS : Quand même un point positif ma trame data est exactement la même que celle du prog qui fonctionne.
    PPS : Pour les question de droit, je suis connecté en administrateur.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 28
    Par défaut
    Bon j'arrive enfin a quelque chose qui marche.
    je ne sais pas forcement pour quelle raison certain problèmes sont résolu mais toujours est-t-il que j'arrive a allumer un pc avec mon code

    je n'envoie plus qu'un seul paquet avec un checksum valide et je passe par l'adresse de broadcast 255.255.255.255

    donc pour ceux que sa intéresse voici un code qui n'as pas encore été nettoyé mais qui fonctionne :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <winsock2.h>
    #include <errno.h> 
     
    int char2int(const char Val)
    {
       if( (Val >= '0') && (Val <= '9') )
          return Val - '0';
     
       if( (Val >= 'a') && (Val <= 'f') )
          return Val - 'a' + 10;
     
       if( (Val >= 'A') && (Val <= 'F') )
          return Val - 'A' + 10;
     
       /* mauvais caractère */
       return -1;
    }
     
    int main(int argc, char *argv[])
    {
        /* ... initialisation de la dll winsock ... */
        WSADATA wsaData;
        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
            fprintf(stderr, "La fonction WSAStartup a echoue.\n");
        else
        {
            /* ... initialisation de la socket ... */
            SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
     
            if (s == INVALID_SOCKET)
                fprintf(stderr, "La fonction socket a echoue.\n");
            else
            {
                char mac[20] = "90fba6083802";
                char data[102];
                int i, tampon;
                int errmac = 0;
     
                /* ... récupération de l'adresse mac ... */
                //printf("entrer l'adresse mac du pc a demarrer :\n");
                //fgets(mac, sizeof mac, stdin);
                char *p = strchr(mac, '\n');
                if(p)
                   *p = 0;
     
                /* ... vérification de l'adresse mac ... */
                if (strlen(mac)!=12) 
                   errmac=1; 
                else 
                {
                     for (i=0;i<(int)strlen(mac);i++) // Boucle parcourrant les caracteres saisis
                     {
                         if ((int)(mac[i])>='a'&&(int)(mac[i])<='f') // Convertion des minuscules en majuscules
                         mac[i]=mac[i]-32;
                         if ( ((int)(mac[i])>='0'&&(int)(mac[i])<='9')==FALSE ){ // Si ce n'est pas un nombre
                            if ( ((int)(mac[i])>='A'&&(int)(mac[i])<='F')==FALSE ) // Si ce n'est pas l'une des 6 premières lettres
                               errmac = 1;
                         }
                     }
                }
     
                if(errmac)
                          fprintf(stderr, "adresse mac non valide.\n");
                else
                {
                    /* ... création du paquet magic ... */
                    for (i=0;i<6;i++)
                         data[i] = 0xff;
     
                    for (i=0;i<12;i=i+2)
                    {
                        tampon = char2int(mac[i])*0x10 + char2int(mac[i+1]);
                        memcpy(&data[i/2+6],&tampon,1);
                    }
     
                    for (i=0;i<15;i++) 
                        memcpy(&data[(i+2)*6],&data[6],6);
     
                    /* ... définition du destinataire ... */
                    SOCKADDR_IN dest;
     
                    /* Set socket options */
                    tampon = 1;
                    if (setsockopt (s, SOL_SOCKET, SO_BROADCAST, (char *)&tampon, sizeof (tampon)) < 0) 
                    {
                       fprintf (stderr, "\r: setsocket failed %s\n", strerror (errno));
                       close (s);
                    }
     
     
                    dest.sin_family       = AF_INET;
                    dest.sin_addr.s_addr  = htonl(0xffffffff); // adresse de broadcast 
                    dest.sin_port         = htons(7);
                    memset(&dest.sin_zero, '\0', sizeof(dest.sin_zero));
     
                    /* ... envoi du paquet ... */
                    if(sendto(s, data, sizeof(data), 0, (SOCKADDR *)&dest, sizeof(dest)) < 0)
                           fprintf(stderr,"Erreur %d a l'envoi du paquet: %s\n",errno,sys_errlist[errno]);
     
                    closesocket(s);
                }
            }
            /* ... libération de la dll winsock ... */
            WSACleanup();
        }	
        return 0;
    }

  13. #13
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 501
    Par défaut
    Merveilleux !!


    j'ai des droits d'auteur sur la fonction char2int() ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 28
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    j'ai des droits d'auteur sur la fonction char2int() ?
    Avec plaisir si personne ne t'as devancé mais vu l'actualité j'ai bien peur que les droits d'auteur ne te permettent pas de remplir ton frigo m'enfin tu pourra toujours te plaindre a la "haute autorité" avec un peu de chance tu pourra peut-être faire bloquer quelques cnx internet.

    PS : dsl pour le lâchage en HS mais c'est le plaisir de coder quelque chose qui fonctionne

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 28
    Par défaut
    Bon désolé de revenir a la charge mais la phase de nettoyage du code me pose encore problème (enfin plutôt d'antiques notions sur les pointeur).

    Pour être plus précis je suis en train de mettre dans une fonction la partie vérification de l'adresse MAC et mon but est de modifier directement la variable mac en passant par les pointeur et non par un return.

    Voici l'appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(ValidMac(&mac)<0)
                 fprintf(stderr, "adresse mac non valide.\n");
    else
    {
       traitement ...
    }
    Et voici la fonction :
    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
     
    int ValidMac(char **addr)
    {
         int i;
         char *p = strchr(**addr, '\n');
         if(p)
              *p = 0;
     
                /* ... vérification de l'adresse mac ... */
         if (strlen(**addr)!=12)
            return -1; 
         else 
         {
              for (i=0;i<(int)strlen(**addr);i++) // Boucle parcourrant les caracteres saisis
              {
                  if ((int)(*addr[i])>='a'&&(int)(*addr[i])<='f') // Convertion des minuscules en majuscules
                  *addr[i]=*addr[i]-32;
                  if ( ((int)(*addr[i])>='0'&&(int)(*addr[i])<='9')==FALSE ){ // Si ce n'est pas un nombre
                     if ( ((int)(*addr[i])>='A'&&(int)(*addr[i])<='F')==FALSE ) // Si ce n'est pas l'une des 6 premières lettres
                        return -1;
                  }
              }
         }
         return 0;
    }
    D'abord je me mange des warnings à l'appel de la fonction et dans la fonction pour strchr et strlen puis un segfault au passage sur strchr.
    Je me suis dis qu'il fallait peut-être un malloc pour addr mais sa ne change pas grand chose.
    Je suppose que la déclaration de la fonction n'est déjà pas bonne de base (sinon pourquoi des warnings) mais après maintes lectures sur les pointeurs je ne comprend toujours pas ou est précisément le problème.

  16. #16
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 501
    Par défaut
    1 remarque tout d'abord, il faut que tu définisses PRECISEMMENT ce qu'est une adresse MAC valide pour toi.
    Dans tu code, tu choisis char mac[20] = "90fba6083802"; pourquoi pas, c'est un format comme un autre ("90:fb:a6:08:38:02" est un autre format mais tu ne l'as pas choisi).

    Ensuite, il faut que tu définisses, toujours précisemment, l'interface de ta fonction de validation. Ta fonction de validation reçoit un pointeur sur la chaine de caractères de l'adresse MAC et retourne 0 si c'est valide ou -1 si invalide. Cette fonction ne modiofie pas la chaine de caractères passée en paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int ValidMac(const char *addr)
    {
    ...
    }
    Ensuite, je te propose ceci comme code :
    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
    int ValidMac(const char *addr)
    {
    int idx;
    int len;
       /* teste la validité du pointeur */
       if(addr == NULL)
          return -1;
     
       /* teste la longueur de la chaine */
       /* une adresse MAC DOIT faire 12 caractères dans mon format */
       /* exemple : "90fba6083802" */
       len = strlen(addr);
       if(len != 12)
          return -1;
     
       /* teste tous les caractères de la chaine */
       for(idx = 0; idx != len; idx++)
       {
          /* teste le caractère courant avec la fonction char2int() */
          /* rappel : char2int() retourne -1 si le caractère n'est pas un */
          /* caractère hexa ou >= 0 si c'est un caractère hexa */
          if(char2int(addr[idx] == -1)
             return -1;
       }
     
       /* tous les caractères ont été testés et sont valides */
       return 0;
    }
    Il est possible qu'il reste 1 ou 2 coquilles dans ce code, je ne l'ai pas testé mais l'esprit est là
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  17. #17
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int ValidMac(char addr[])
    {
         int i;
         char *p = strchr(addr, '\n');
    <...>
    Comment passer un tableau en paramètre à une fonction ?

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 28
    Par défaut
    Bon en fait je suis pas sûr de m'être bien fait comprendre.

    L'adresse que je reçois dans mac au début doit être sans séparateur et soit en minuscules soit en majuscules.
    Ensuite via la fonction ValidMac() je test la longueur de la chaine, puis chaque caractères. Si le caractère est "valide" (caractère hexa) entre a et f, je le remplace par l'équivalent majuscule directement dans la variable mac (puisque addr est censé pointer sur mac).

    P.S. Bonne idée l'utilisation de la fameuse fonction char2int() j'étais carrément passé a coté

  19. #19
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 501
    Par défaut
    Citation Envoyé par kennylafougere Voir le message
    Bon en fait je suis pas sûr de m'être bien fait comprendre.
    Maintenant, c'est plus clair effectivement.

    Citation Envoyé par kennylafougere Voir le message
    Si le caractère est "valide" (caractère hexa) entre a et f, je le remplace par l'équivalent majuscule directement dans la variable mac
    Quel intérêt ?

    Que ton adresse MAC soit "aa99..." ou "Aa99..." ou "AA99..." la fonction de décodage des caractères char2int() le gère très bien. Donc cela ne sert à rien de modifier les minuscules hexa pour des majuscules hexa ou alors, il y a une autre raison qui m"échappe.

    De plus, conceptuellement, une fonction qui s'appelle ValidQuelqueChose() ne fait que valider un contenu, c'est à dire, c'est bon ou c'est pas bon. Si tu veux modifier le paramètre, c'est plutôt une fonction MiseEnFormeQuelqueChose() ou AdapteQuelqueChose() qu'il faudrait.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 28
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Quel intérêt ?

    Que ton adresse MAC soit "aa99..." ou "Aa99..." ou "AA99..." la fonction de décodage des caractères char2int() le gère très bien. Donc cela ne sert à rien de modifier les minuscules hexa pour des majuscules hexa ou alors, il y a une autre raison qui m"échappe.
    Le paquet magique doit contenir la valeur des lettres majuscules
    edit : en fait j'ai pas testé avec les valeurs des minuscules mais toutes les sources que j'ai vu faisaient comme sa.

    Citation Envoyé par ram-0000 Voir le message
    De plus, conceptuellement, une fonction qui s'appelle ValidQuelqueChose() ne fait que valider un contenu, c'est à dire, c'est bon ou c'est pas bon. Si tu veux modifier le paramètre, c'est plutôt une fonction MiseEnFormeQuelqueChose() ou AdapteQuelqueChose() qu'il faudrait.
    +1 mais c'est vrai que c'est un de mes gros défauts quand je développe je commence par faire une fonction de base et j'agglomère pleins de choses dedans et sa ressemble plus vraiment au nom donné a la base (quand je le choisi déjà correctement au début )

Discussions similaires

  1. Wake on Lan avec carte réseau intel pro 1000 PL
    Par christophe_s46 dans le forum Composants
    Réponses: 1
    Dernier message: 31/08/2009, 20h22
  2. Wake On Lan :/
    Par Mikaz dans le forum Apple
    Réponses: 2
    Dernier message: 10/08/2009, 10h54
  3. wake on lan sur du wifi
    Par Mut dans le forum Hardware
    Réponses: 11
    Dernier message: 11/01/2009, 18h49
  4. Fichier BATCH pour exécuter une commande (Wake on LAN)
    Par snoopy69 dans le forum Windows XP
    Réponses: 0
    Dernier message: 23/04/2008, 08h14
  5. Filtrer un Wake-On-LAN
    Par Nixar dans le forum Protocoles
    Réponses: 2
    Dernier message: 24/04/2006, 13h16

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