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 :

erreur de conversion


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 51
    Points : 17
    Points
    17
    Par défaut erreur de conversion
    Bonjour,

    J'ai compilé ce code par gcc sous linux et j'ai une erreure de conversion a cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    packet = malloc(sizeof(struct iphdr) + sizeof (struct icmphdr) + psize);
    Pouvez vous m'aider pour le corriger et merci d'avance

    Voila le code complete :


    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
    //Générer un paquet IP qui encapsule un paquet ICMP (application un PING)
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <linux/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <errno.h>
    #include <netdb.h>
    #include <string.h>
    #include <signal.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <netinet/ip.h>
    #include <netinet/ip_icmp.h>
    #include <ctype.h>
    #include <unistd.h>
    unsigned short in_chksum(unsigned short *, int);
    int main (int argc, char * argv[])
    {
    int sock;
    int rc;
    int num;
    struct sockaddr_in addrsock_source;
    struct sockaddr_in addrsock_dest;
    struct iphdr *ip;
    struct icmphdr *icmp;
    char *packet;
    int psize;
    //Syntaxe : adresse
    if (argc != 4)
    {
    perror("Syntaxe : exo1 adresse-source adresse-dest taille");
    exit(1);
    }
    //Recuperation de la taille
    psize= atoi(argv[3]); //Taille du packet
    //Création de la structure d'adressage
    addrsock_source.sin_addr.s_addr = inet_addr(argv[1]); //
    Affectation de l'adresse source
    addrsock_dest.sin_addr.s_addr = inet_addr(argv[2]); //
    Affectation de l'adress dest
    addrsock_source.sin_family = AF_INET; //
    Connection de type AF_INET
    addrsock_dest.sin_family = AF_INET; // Connection de type AF_INET
    addrsock_source.sin_port = htons(0);// Port = 0
    addrsock_dest.sin_port = htons(0); // Port = 0
    //Création de la socket
    2
    sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
    if (sock < 0)
    {
    perror("Erreur de création de Socket");
    exit(-1);
    }
    //Generation d'un espace mémoire de la taille du paquet (en tete IP + en tete
    ICMP + données)
    packet = malloc(sizeof(struct iphdr) + sizeof (struct icmphdr) + psize);
    ip = (struct iphdr *) packet;
    icmp = (struct icmphdr *) (packet + sizeof(struct iphdr));
    // Mise à 0 de tous le bloc mémoire
    memset(packet, 0, sizeof(struct iphdr) + sizeof(struct icmphdr) + psize);
    // Définition des champs des trames IP & ICMP
    ip->tot_len = htons(sizeof(struct iphdr) + sizeof(struct icmphdr) + psize);
    ip->ihl = 5;
    ip->version = 4;
    ip->ttl = 255;
    ip->tos = 0;
    ip->frag_off = 0;
    ip->protocol = IPPROTO_ICMP;
    ip->saddr = addrsock_source.sin_addr.s_addr;
    ip->daddr = addrsock_dest.sin_addr.s_addr;
    ip->check = in_chksum((unsigned short *)ip, sizeof(struct iphdr));
    icmp->type = 8;
    icmp->code = 0;
    icmp->checksum = in_chksum((unsigned short *)icmp, sizeof(struct icmphdr) +
    psize);
    // Envoi de la trame
    rc=sendto(sock, packet, sizeof(struct iphdr) + sizeof(struct icmphdr) +
    psize, 0, (struct sockaddr *)&addrsock_dest, sizeof(struct sockaddr));
    printf("Nombre de bits transmis : %d\n",rc);
    // Liberation de la mémoire
    // free(packet);
    }
    unsigned short in_chksum (unsigned short *addr, int len)
    {
    register int nleft = len;
    register int sum = 0;
    u_short answer = 0;
    while (nleft > 1)
    {
    sum += *addr++;
    nleft -= 2;
    }
    if (nleft == 1)
    {
    *(u_char *)(&answer) = *(u_char *)addr;
    sum += answer;
    }
    sum = (sum >> 16) + (sum + 0xffff);
    sum += (sum >> 16);
    answer = ~sum;
    return(answer);}

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    vous vous êtes trompé de forum, votre code est du C, et ici c'est le forum C++.

    Cordialement.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    « Une erreur de conversion » ? Voulais-tu dire « erreur de compilation » ? Dans tous les cas, merci de préciser un peu plus le problème.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    malloc renvois un pointeur void.
    Toi tu attend un pointeur char.

    Pointeur = (char *) malloc(...);

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par Neckara Voir le message
    malloc renvois un pointeur void.
    Toi tu attend un pointeur char.

    Pointeur = (char *) malloc(...);
    C'est légal en C d'omettre un cast pour le transtypage d'un void* en un autre type de pointeur.
    (A moins que le posteur n'utilise un compilateur C++ au lieu d'un compilateur C ??? )
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    à moins que psize ne soit pas un nombre, je ne vois pas trop où pourrait être l'erreur.

    En tout cas, je ne savais pas qu'on pouvait omettre le (char *) en C en compilant en C, est-ce dans la norme du C ?

    Mais je pense qu'il vaut mieux tout de même le mettre par soucis de lisibilité.

  7. #7
    Membre éclairé Avatar de messinese
    Homme Profil pro
    IT Security Consultant
    Inscrit en
    Septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IT Security Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 429
    Points : 876
    Points
    876
    Par défaut
    Citation Envoyé par Neckara Voir le message
    malloc renvois un pointeur void.
    Toi tu attend un pointeur char.

    Pointeur = (char *) malloc(...);
    Oui , a part cela je vois rien d'autre, le proto de malloc() stipulant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void *malloc(size_t size);
    si ce n'est une erreur possible ici (oubli? inattention?):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    .....
    //Generation d'un espace mémoire de la taille du paquet (en tete IP + en tete
    ICMP + données)
    packet = malloc(sizeof(struct iphdr) + sizeof (struct icmphdr) + psize);
    ...
    ou on remarque un commentaire ' // ' sur 2 lignes juste avant ton allocation mémoire...

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par messinese Voir le message
    ou on remarque un commentaire ' // ' sur 2 lignes juste avant ton allocation mémoire...
    ça m'étonnerais que ce soit cela qui provoque l'erreur de conversion, une erreur de variable non déclarée (ICMP was not declared in this scope) oui mais une erreur de conversion?

    A mon avis c'est en recopiant le code ici qu'il a dû rajouté un retour à la ligne car le commentaire était un petit peu long?

  9. #9
    Membre éclairé Avatar de messinese
    Homme Profil pro
    IT Security Consultant
    Inscrit en
    Septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IT Security Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 429
    Points : 876
    Points
    876
    Par défaut
    Oui je le pense aussi, aprés n'ayant pas vu l'output du compilo , la ligne se trouvant etre celle-ci et ne voyant rien de vraiment anormal je tente le coup

Discussions similaires

  1. Erreur de conversion
    Par HULK dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/09/2005, 11h14
  2. Erreur de conversion
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/08/2005, 16h23
  3. Erreur de conversion et requête dynamique dans une procédure
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/08/2005, 15h12
  4. Erreur de conversion de type Null en String
    Par navis84 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/07/2005, 15h25
  5. Erreur de conversion int to socklen_t
    Par def_jam_vendetta dans le forum C++
    Réponses: 6
    Dernier message: 04/03/2005, 10h53

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