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 :

[Socket]Incompatible type ?


Sujet :

Réseau C

  1. #1
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut [Socket]Incompatible type ?
    Voila je possède une variable de type : sockaddr_in qui se nomme on va dire MySocket.
    J'essaye de lui attribuer une adresse par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MySocket.sin_addr = inet_addr("127.0.0.1");
    Cependant le compilateur me réponds : error C2115: '=' : incompatible types

    J'ai beau harceler google je ne comprends pas

    Merci pour votre aide. (VC++ 6 & Windows XP)

    PS : dois je utiliser winsock.h ou winsock2.h ?

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Points : 146
    Points
    146
    Par défaut
    Bon, j'y connais rien sur les sockets, mais dans le man j'ai vu le prototype de ta fonction :
    in_addr_t inet_addr (const char * cp);

    et
    struct in_addr {
    unsigned long int s_addr;
    }

    alors est ce que ton MySocket.sin_addr est de type "unsigned long" ?
    et d'ailleurs pourquoi dans le man il y a "unsigned long int" ? pour moi ca veut rien diire.. et soit c'est de l'int (ou unsigned int), soid du long (ou unsigned long)

    Autre chose, ton adresse de loopback 127.0.0.1, tu l'as mise comme une chaine de caractères, et non une adresse a passé pour le pointeur.. c'est pas de la que viendrait le probleme ?

  3. #3
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Citation Envoyé par Willand
    Autre chose, ton adresse de loopback 127.0.0.1, tu l'as mise comme une chaine de caractères, et non une adresse a passé pour le pointeur.. c'est pas de la que viendrait le probleme ?
    Non je pense pas car la fonction inet_addr est déclaré comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inet_addr(const char FAR * cp);
    Donc si j'ai bien compris c est bien comme ceci qu'il faut entrer l'adresse :

    "255.255.255.255"

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par Zoso_
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inet_addr(const char FAR * cp);
    Donc si j'ai bien compris c est bien comme ceci qu'il faut entrer l'adresse :

    "255.255.255.255"
    ca represente quoi le "FAR" ?
    mais dans ce cas la, pourquoi il y a un * ? c'est un pointeur, et.. tu dois toujours filer une adresse a un pointeur..

    Un pointeur est déstiné à contenir une adresse

  5. #5
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Oui je viens de me rendre compte, putain je suis vraiment fatigué, dur dur la fin de semaine.
    Désolés de vous déranger pour si peu.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Le FAR est une vieille notation des pointeurs des pointeurs en C. Il me semble que c'était lorsque l'adressage se faisait sur 16 bit et qu'on voulait un pointeur 32 bit on utilisait void FAR * ptr;.

    Enfin je parle de choses que je n'ai pas connue, Emmanuel pour peut-être confirmer (ou infirmer) mes dires

  7. #7
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par Yabo
    Le FAR est une vieille notation des pointeurs des pointeurs en C.
    c'etait voulu le "des pointeurs" en double ?
    si oui, ca fait un "const char **cp", mais c'est bizarre, c'est pas ce qui est ecrit dans le man..

    Il me semble que c'était lorsque l'adressage se faisait sur 16 bit et qu'on voulait un pointeur 32 bit on utilisait void FAR * ptr;.
    euh wé...
    en plus clair ?

    ps : merci pour les explications

  8. #8
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Moi j'ai tjs utilisé ca comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MySocket.sin_addr.s_addr = inet_addr("127.0.0.1");
    Mais ca dépend comment on déclare MySocket je crois...

    Sinon je ne comprend pas où est l'erreur dans son code en ce qui concerne le pointeur. Quand on indique char*p dans le prototype, ca veut dire qu'on peut passer une chaine ... c'est a dire un tableau de char.
    Ca revient a mettre : char p[] , non ? Ca me semble bizarre !

    Nas'

  9. #9
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Bon j'ai quand meme un problème
    Je devrais pouvoir faire ça quand meme non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MySocket.sin_addr = INADDR_ANY;
    Mais la pareil type incompatible.

  10. #10
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par Nasky
    Sinon je ne comprend pas où est l'erreur dans son code en ce qui concerne le pointeur. Quand on indique char*p dans le prototype, ca veut dire qu'on peut passer une chaine ... c'est a dire un tableau de char.
    Ca revient a mettre : char p[] , non ? Ca me semble bizarre !
    oui.. mais tu passes l'adresse du tableau de char, pas le char directement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
    char chaine[3] = "le";
     
    // j'appelle une fonction qui attend un pointeur en argument 
    mafonction(&chaine[0]);
    return 0;
    }

  11. #11
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Citation Envoyé par Nasky
    Moi j'ai tjs utilisé ca comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MySocket.sin_addr.s_addr = inet_addr("127.0.0.1");
    Mais ca dépend comment on déclare MySocket je crois...

    Sinon je ne comprend pas où est l'erreur dans son code en ce qui concerne le pointeur. Quand on indique char*p dans le prototype, ca veut dire qu'on peut passer une chaine ... c'est a dire un tableau de char.
    Ca revient a mettre : char p[] , non ? Ca me semble bizarre !

    Nas'

    Arf maintenant ça fonctionne....
    Il me manquait le 's_adrr' à la fin.
    Bizarre le menu qui s'affiche pour aider à coder (je me fais comprendre ? ) ne m'afficher pas cette possiblité..

  12. #12
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Non ca marche de rentrer directement la chaine. J'ai regardé sur google et ts les programmes de code sockets en C/C++ montrent qu'on rentre directement l'IP en argument...

    Nas'

  13. #13
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par Zoso_
    Bon j'ai quand meme un problème
    Je devrais pouvoir faire ça quand meme non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MySocket.sin_addr = INADDR_ANY;
    Mais la pareil type incompatible.
    tu peux pas faire un copier coller de la structure que t'as défini pour voir ?

  14. #14
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct sockaddr_in Addresse_Distante;
    // Type de famille : IPV4 
    Addresse_Distante.sin_family = AF_INET;
     
    // Port sur lequel on veut se connecter (25 : SMTP) 
    Addresse_Distante.sin_port = htons(25);
     
    // Adresse IP du destinataire 
    Addresse_Distante.sin_addr.s_addr = inet_addr(Adresse_Serveur);
     
    // Remplie de 0 l'élément sin_zero de la strucuture sockaddr_in 
    memset(&(Addresse_Distante.sin_zero), '\0', 8);
    la ça compile.... parce qu'il me manquait le 's_addr' lorsque je donne l'adresse.
    L'IDE ne me proposait pas cette possibilité...

  15. #15
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Points : 146
    Points
    146
    Par défaut
    ah oui ce code marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void mafonction(char *unechaine)
    {
            printf("%s", unechaine);
    }
     
    int main()
    {
            mafonction("chaine");
            return 0;
    }
    mais je comprend pas pourquoi, la je donne pas l'adresse du premier caractère de la chaine en argument de mafonction...

  16. #16
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Utilises-tu winsock ou winsock2 ?
    Parce que chez moi, sans le s_addr ca marche !
    la variable s_addr vient de la structure sockaddr contenu dans la structure sockaddr_in . A la base, avec sockaddr on peut s'en sortir mais c'était plus compliqué alors certains développeurs ont crée la structure sockaddr_in ... ca vient peut etre donc du header (?)

    Nas'

  17. #17
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    J'utilise winsock2 et toi ?
    D'ailleur il vaut mieux utiliser winsock2 ou winsock ? (Différence ?)

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par Willand
    c'etait voulu le "des pointeurs" en double ?
    Non désolé.

    Citation Envoyé par Willand
    euh wé...
    en plus clair ?
    Sur les OS récents l'adressage ce fait sur 32 bit (la taille d'un int). Donc on peut avoir autant d'octet en mémoire qu'on peut addresser. Mais avant ca se faisait sur 16 bit (donc on ne pouvait addresser que moitié-moins de mémoire) et en C lorsqu'on voulait addresser sur 32 bit on utilisait le mot FAR.
    Encore une fois c'était y a longtemps et ce sont des souvenirs sur ce que j'avais lu dans un article. Si je me trompe corrigez moi

  19. #19
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Mais pourquoi à chaque fois que je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int dsocket
    dsocket = socket(AF_INET, SOCK_STREAM, 0);
    ça me renvoit -1
    J'arrive pas à récupérer mon descripteur de fichier

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    tu as lu le cours sur les sockets sur le site ? (sections C++ mais c'est la même chose en C).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Incompatible types in return
    Par DJ Caësar 9114 dans le forum C
    Réponses: 9
    Dernier message: 15/04/2007, 23h22
  2. error: incompatible types in assignment
    Par panda31 dans le forum C
    Réponses: 2
    Dernier message: 13/06/2006, 10h46
  3. Réponses: 4
    Dernier message: 05/12/2005, 19h24
  4. [D6] OnKeyPress- incompatibles types-
    Par Redsky dans le forum Langage
    Réponses: 2
    Dernier message: 23/10/2005, 12h16

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