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

Windows Discussion :

Utilisation de la fonction WSAAddressToString()?


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut Utilisation de la fonction WSAAddressToString()?
    Merci de ton aide . J'ai effectué quelques modifications en passant désormais une structure de type sockaddr_in6 à la fonction. En regardant de plus près sa signature j'ai aussi vu qu'elle voulait un LPDWORD qui semble être en réalité un pointeur vers un DWORD. J'ai donc modifié aussi le type.

    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
    struct in_addr                 MulticastAddr;
    struct sockaddr_in6          MulticastAddr_6;
    char				  lAdresseMulticastV6[46];
    DWORD				dw = sizeof(lAdresseMulticastV6) ;
    DWORD				MulticastAddr_6_Size = sizeof(MulticastAddr_6);
    
    if (addressType == IPV4)
    {
         MulticastAddr = connection->mediaAddress;
         sprintf(URL, "udp://%s -rtp -audio", inet_ntoa(MulticastAddr));
    }
    else if(addressType == IPV6)
    {
         MulticastAddr_6.sin6_addr = connection->mediaAddressIPV6;
         if( 0 == (WSAAddressToString((struct sockaddr *)&MulticastAddr_6,MulticastAddr_6_Size,NULL,lAdresseMulticastV6,&dw)))
         {
            	sprintf(URL, "udp://%s -rtp -audio", lAdresseMulticastV6);		     }
         else
         {
            	printf("Erreur WSAAddressToString : %d \n", WSAGetLastError());    
         }
    }
    Néanmoins, ça ne fonctionne toujours pas mais l'erreur n'est plus la même...c'est la 10022 : "WSAEINVAL : The specified address is not a valid socket address, or no transport provider supports the indicated address family."

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne pense pas qu'une structure inet6_addr soit castable comme ça en structure sockaddr_in...
    Tu dois utiliser une structure sockaddr_in6.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Merci de ton aide . J'ai effectué quelques modifications en passant désormais une structure de type sockaddr_in6 à la fonction. En regardant de plus près sa signature j'ai aussi vu qu'elle voulait un LPDWORD qui semble être en réalité un pointeur vers un DWORD. J'ai donc modifié aussi le type.

    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
    struct in_addr                 MulticastAddr;
    struct sockaddr_in6          MulticastAddr_6;
    char				  lAdresseMulticastV6[46];
    DWORD				dw = sizeof(lAdresseMulticastV6) ;
    DWORD				MulticastAddr_6_Size = sizeof(MulticastAddr_6);
    
    if (addressType == IPV4)
    {
         MulticastAddr = connection->mediaAddress;
         sprintf(URL, "udp://%s -rtp -audio", inet_ntoa(MulticastAddr));
    }
    else if(addressType == IPV6)
    {
         MulticastAddr_6.sin6_addr = connection->mediaAddressIPV6;
         if( 0 == (WSAAddressToString((struct sockaddr *)&MulticastAddr_6,MulticastAddr_6_Size,NULL,lAdresseMulticastV6,&dw)))
         {
            	sprintf(URL, "udp://%s -rtp -audio", lAdresseMulticastV6);		     }
         else
         {
            	printf("Erreur WSAAddressToString : %d \n", WSAGetLastError());    
         }
    }
    Néanmoins, ça ne fonctionne toujours pas mais l'erreur n'est plus la même...c'est la 10022 : "WSAEINVAL : The specified address is not a valid socket address, or no transport provider supports the indicated address family."

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu n'as pas réglé les autres membres de la structure sockaddr_in6.
    Notamment, le champ "address family" qui doit être réglé à AF_INET6.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Merci encore
    J'ai fait les modifs correspondantes (mais par défaut le champ famille est déjà à IPv6 => 17 hexa).
    Mais ça ne fonctionne toujours pas mais j'ai de nouveau l'erreur 10014:/, franchement je ne comprends par pourquoi...

    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
    struct in_addr                 MulticastAddr;
    struct sockaddr_in6          MulticastAddr_6;
    char				  lAdresseMulticastV6[46];
    DWORD				dw = sizeof(lAdresseMulticastV6) ;
    DWORD				MulticastAddr_6_Size = sizeof(MulticastAddr_6);
    
    if (addressType == IPV4)
    {
         MulticastAddr = connection->mediaAddress;
         sprintf(URL, "udp://%s -rtp -audio", inet_ntoa(MulticastAddr));
    }
    else if(addressType == IPV6)
    {
         MulticastAddr_6.sin6_addr = connection->mediaAddressIPV6;
         MulticastAddr_6.sin6_family = AF_INET6;
         MulticastAddr_6.sin6_flowinfo = 0;
         if( 0 == (WSAAddressToString((struct sockaddr *)&MulticastAddr_6,MulticastAddr_6_Size,NULL,lAdresseMulticastV6,&dw)))
         {
            	sprintf(URL, "udp://%s -rtp -audio", lAdresseMulticastV6);		     }
         else
         {
            	printf("Erreur WSAAddressToString : %d \n", WSAGetLastError());    
         }
    }
    Pour essayer d'avancer, je précise que l'adresse contenue dans mediaAddressIPV6 a été obtenue avec la fonction "symétrique" WSAStringToAdress comme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct sockaddr_in6	addr_6;
    int addr_6_size = sizeof(addr_6);
    if (addressType == IPV6)
    {	
        if(WSAStringToAddress(structure->addressStr, AF_INET6, NULL, (struct sockaddr *)&addr_6, &addr_6_size) != 0)
        {
         printf("Erreur WSAStringToAddress : %d \n", WSAGetLastError());
         }
    connection->mediaAddressIPV6 = addr_6.sin6_addr;
    }
    Mais ici, aucune erreur et l'adresse IPv6 apparait bien dans l'ordre "réseau" dans la structure sockaddr_in6. Je ne pense donc pas qu'il y est une erreur ici.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Et hop résolu

    Tu avais raison Médinoc, il faut impérativement initialiser TOUS les champs de la structure sockaddr_in6 et pas seulement "familly" ou "address"....

    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [LG]Utilisation de la fonction time
    Par kmitz dans le forum Langage
    Réponses: 4
    Dernier message: 08/04/2005, 13h05
  2. Utilisation de la fonction de déploiement
    Par mchicoix dans le forum XMLRAD
    Réponses: 4
    Dernier message: 01/03/2005, 14h35
  3. [LG]Utilisation de la fonction Random
    Par chloe95 dans le forum Langage
    Réponses: 1
    Dernier message: 01/03/2005, 14h20
  4. Utilisation de la fonction qsort
    Par Jsmeline dans le forum C
    Réponses: 8
    Dernier message: 28/01/2005, 12h40
  5. [LG]librairies : utiliser seulement quelques fonctions
    Par wwwroom dans le forum Langage
    Réponses: 13
    Dernier message: 14/05/2004, 22h50

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