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 :

Message d'erreur que je n'arrive pas à comprendre


Sujet :

C

  1. #1
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    26
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 26
    Points : 34
    Points
    34
    Par défaut Message d'erreur que je n'arrive pas à comprendre
    Voila mon 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
    89
    90
    91
    92
    93
    94
    95
    /* Code du client à lancer apres le serveur ; lancer avec --> serveur <idMachineSerevur> <chaine> */
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <linux/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <string.h>
    #include <unistd.h>
     
    int main(argc, argv)
    int argc;
    char **argv;
    {
    int sd,                            /* description du socket */
        lon;                        /* longueur du buffer utilisé */
    struct sockaddr_in adsock;         /* adresse de socket local */
    struct hostent *hptr;            /* info sur la machine hote */
    struct servent *sptr;            /* info sur le service */
     
    char buf[256];
    char *prog;                        /* nom du programme */
    char *host;                        /* nom de la machine distante */
    char *mesg;                        /* message envoye */
     
    prog=argv[0];
    printf("Code client> %s\n", prog);
     
    if (argc != 3)
        {
            perror(">> Il faut deux arguments au programme");
            exit(1);
        }
    host = argv[1];
    mesg = argv[2];
     
    printf("Code client --> machine = %s\n", host);
    printf("Code client --> message = %s\n", mesg);
     
    if ((hptr = gethostbyname(host)) == NULL)
        {
            perror(">> Pb la recup des infos du host");
            exit(1);
        }
     
    /* copie car/car des inofs de hptr avec adsock */
    bcopy(    (char *)hptr->h_addr,
            (char *)&adsock.sin_addr,
            hptr->h_length);
    adsock.sin_family = AF_INET;        /* ou hptr->h_addrtype; */
     
    /* 2 facons de definir le service qu'on va utiliser à distance */
     
    /*solution 1 : numéro d'un servie banalisé, par ex. "irc" */
    if ((sptr = getservbyname("irc","tcp")) == NULL)
        {
            perror(">> Pb pour la recup des infos sur le service");
            exit(1);
        }
    adsock.sin_port = htons(sptr->s_port);
     
     
    /* solution 2 : un nouveau numéro connu pour le service usité */
    adsock.sin_port    = htons(5000);
     
    printf("Code client --> numport = %d\n", ntohs(sptr->s_port));
     
    if((sd = socket(AF_INET, SOCK_STREAM, 0))<0)
        {
            perror(">> Pb de creation de la socket");
            exit(1);
        }
     
    /* tentative de connexion au serveur dont les infos sont dans adsock */
    ( ici !!! )if ((connect(sd, &adsock, sizeof(adsock)))<0)
        {
            perror(">> Pb de connexion");
            exit(1);
        }
     
    if ((write(sd, mesg, strlen(mesg)))<0)
        {
            perror(">> Pb sur le write");
            exit(1);
        }
     
    printf("Code client --> affichage apres reception ...\n");
    while((lon = read(sd, buf, sizeof(buf)))>0)
        write(1, buf, lon);
    printf("\nCode client --> c'est fini !! \n");
    close(sd);
    exit(0);
    }
     
    /* fin */
    et les messages d'erreurs :
    dans main.c : (ici !!!!) warning: passing argument 2 of ‘connect’ from incompatible pointer type|

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 517
    Points : 50 367
    Points
    50 367
    Par défaut
    C'est un des rares cas où il faut aider le compilateur avec un cast.

    Si on regarde l'aide de la fonction connect(), on voie que le 2eme paramètre est un "struct sockaddr *"

    ce "struct sockaddr" est une structure générique qui permet de définir une adresse (X25, IP, IPv6, ...).

    Toi, dans ton code, tu passe une "struct sockaddr_in" ce qui est presque pareil mais pas tout à fait (regarde dans les include). Il s'agit d'une adresse IP (d'ailleurs le début de la structure est initialisé avec struct sockaddr_in.sin_family = AF_INET pour que le noyau reconnaisse le type d'adresse et sache s'adapter.

    Le noyau attend un "struct sockaddr *", tu lui passes un "struct sockaddr_in *" en toute connaissance de cause (le en toute connaissance de cause est important), il faut donc caster pour supprimer le warning (ou erreur).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ((connect(sd, (struct sockaddr *)&adsock, sizeof(adsock)))<0)
        {
            perror(">> Pb de connexion");
            exit(1);
        }
    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
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    26
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 26
    Points : 34
    Points
    34
    Par défaut momento
    merciiiiii

Discussions similaires

  1. Erreur que je n'arrive pas à comprendre
    Par Francky44003 dans le forum Débuter
    Réponses: 1
    Dernier message: 05/01/2011, 18h39
  2. Réponses: 4
    Dernier message: 18/02/2010, 16h39
  3. Message d'erreur que je n'arrive pas à résoudre
    Par MAMIKA dans le forum MATLAB
    Réponses: 5
    Dernier message: 15/09/2008, 13h17
  4. Réponses: 12
    Dernier message: 11/04/2006, 17h36
  5. [Débutant] Message d'erreur que je ne comprends pas
    Par Le Furet dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2006, 17h37

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