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 :

error: dereferencing pointer to incomplete type


Sujet :

Réseau C

  1. #1
    Membre habitué Avatar de rufa11
    Consultant informatique
    Inscrit en
    Décembre 2007
    Messages
    300
    Détails du profil
    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 300
    Points : 136
    Points
    136
    Par défaut error: dereferencing pointer to incomplete type
    Bonjour,

    SVP il y a un problème que je n'arrive pas à résoudre, quand je compile le code du Client qui envoi une chaine de caractère au Serveur via les socket j'ai une érreur, le code est:

    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
    #if defined (WIN32)
        #include <winsock2.h>
        #include <ws2tpip.h>
        typedef int socklen_t;
    #elif defined (linux)
        #include <sys/types.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>
        #include <unistd.h>
        #include <netdb.h> 
        #include <errno.h>
        #include <time.h>
        #include <string.h>
        #define INVALID_SOCKET -1
        #define SOCKET_ERROR -1
        #define closesocket(s) close(s)
        typedef int SOCKET;
        typedef struct sockaddr_in SOCKADDR_IN;
        typedef struct sockaddr SOCKADDR;
    #endif
     
    #include <stdio.h>
    #include <stdlib.h>
    #define PORT 1500
     
    int main(void)
    {
        #if defined (WIN32)
            WSADATA WSAData;
            int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
        #else
            int erreur = 0;
        #endif
    
    struct hostent *hostinfos;
    SOCKET sock;
    SOCKADDR_IN sin = { 0 };
    struct in_addr **addr_list;
    char buffer[32];
    int i;
    int tosize = sizeof sin;
    
        /* Si les sockets Windows fonctionnent */
        if(!erreur)
        {
            /* Création de la socket */
            sock = socket(AF_INET, SOCK_DGRAM, 0);
    
            host_infos = gethostbyname("localhost");
            if (host_infos == NULL) 
            {    // do some error checking
                 herror("gethostbyname"); // herror(), NOT perror()
                 exit(1);
            }
    
    // print information about this host:
    printf("Official name is: %s\n", hostinfos->h_name);
    printf("IP address: %s\n", inet_ntoa(*(struct in_addr*)hostinfos->h_addr));
    printf("All addresses: ");
     addr_list = *(struct in_addr **)hostinfos->h_addr_list;
    for(i = 0; addr_list[i] != NULL; i++) {
        printf("%s ", inet_ntoa(*addr_list[i]));
    
      }
     
            /* Configuration de la connexion */
     sin.sin_addr = * (struct IN_ADDR *)hostinfos->h_addr;           /* l erreur est a ce niveau la a cté du premier étoile*/
           /* sin.sin_addr.s_addr = inet_addr("127.0.0.1"); */
            sin.sin_family = AF_INET;
            sin.sin_port = htons(PORT);
              
            /* Envois de la chaine de caractère*/ 
    
                 printf("\n Please enter the family name student:");
                 scanf("%s",buffer);
                 erreur = send(sock, buffer, 32, 0);
     
                        if(erreur != SOCKET_ERROR)
                            printf("Chaine envoyée : %s\n", buffer);
                        else
                            printf("Erreur de transmission\n");
     
    
          
            /* On ferme la socket */
            closesocket(sock);
     
            #if defined (WIN32)
                WSACleanup();
            #endif
        }
     
        /* On attend que l'utilisateur tape sur une touche, puis on ferme */
        getchar();
     
        return EXIT_SUCCESS;
    }
    Et l'erreur est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Client2.c:68:18: error: dereferencing pointer to incomplete type
      sin.sin_addr = (* (struct IN_ADDR *)hostinfos->h_addr);
    Je ne comprend pas, toutes les bibliothèques sont déclarées, et la syntaxe est correcte, SVP est ce que quelqu'un a une idée?

    Merci.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Bonjour,

    C'est subtil, mais tu as écrit « struct IN_ADDR », donc en écrivant « in_addr » en majuscule. C'est visiblement la notation que tu utilises pour tes typedefs, mais alors il aurait fallu l'écrire sans le préfixe « struct » et je ne l'ai vu défini nulle part, contrairement à SOCKET, SOCKADDR et SOCKADDR_IN.

    Par conséquent, « struct IN_ADDR » est un type incomplet. Il reste valide dans une certaine mesure mais tant qu'il n'est pas clairement défini, on ne peut pas savoir ce qu'il y a dedans et, donc, on ne peut pas le déréférencer, et encore moins l'affecter son contenu à une autre instance.

  3. #3
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Les structures réseaux en majuscule sont généralement des structures Windows. Il doit donc te manquer un typedef si tu tentes de compiler sous linux.

Discussions similaires

  1. error: dereferencing pointer to incomplete type
    Par Amnael dans le forum Débuter
    Réponses: 15
    Dernier message: 16/03/2014, 23h26
  2. dereferencing pointer to incomplete type
    Par Almenor dans le forum Débuter
    Réponses: 10
    Dernier message: 31/05/2012, 10h17
  3. dereferencing pointer to incomplete type
    Par Anasiben dans le forum Débuter
    Réponses: 3
    Dernier message: 19/05/2011, 16h39
  4. forward declaration et error: dereferencing pointer
    Par vincent.mbg dans le forum C
    Réponses: 4
    Dernier message: 15/06/2010, 12h57
  5. dereferencing pointer to incomplete type
    Par Newgaia dans le forum Débuter
    Réponses: 2
    Dernier message: 19/04/2009, 19h00

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