[RESOLU] Utilisation de la fonction WSAAddressToString()

Utilisation de la fonction WSAAddressToString() [RESOLU] - API Win32 - Programmation

Marsh Posté le 01-07-2008 à 14:44:35    

Bonjour à tous!
 
    Dans le cadre de mon projet d'amener un support IPv6 à un player video, je rencontre quelques problèmes (et c'est rien de le dire  :D ) avec cette satanée fonction WSAAddressToString(). Voici le code que j'utilise afin de transformer une adresse IPv6 en chaine de caractère :
 

Code :
  1. struct in_addr                 MulticastAddr;
  2. struct sockaddr_in6          MulticastAddr_6;
  3. char      lAdresseMulticastV6[46];
  4. DWORD    dw = sizeof(lAdresseMulticastV6) ;
  5. DWORD    MulticastAddr_6_Size = sizeof(MulticastAddr_6);
  6. if (addressType == IPV4)
  7. {
  8.      MulticastAddr = connection->mediaAddress;
  9.      sprintf(URL, "udp://%s -rtp -audio", inet_ntoa(MulticastAddr));
  10. }
  11. else if(addressType == IPV6)
  12. {
  13.      MulticastAddr_6.sin6_addr = connection->mediaAddressIPV6;
  14.      MulticastAddr_6.sin6_family = AF_INET6;
  15.      MulticastAddr_6.sin6_flowinfo = 0;
  16.      if( 0 == (WSAAddressToString((struct sockaddr *)&MulticastAddr_6,MulticastAddr_6_Size,NULL,lAdresseMulticastV6,&dw)))
  17.      {
  18.          sprintf(URL, "udp://%s -rtp -audio", lAdresseMulticastV6);       }
  19.      else
  20.      {
  21.          printf("Erreur WSAAddressToString : %d \n", WSAGetLastError());   
  22.      }
  23. }


 
L'erreur 10014 :" WSAEFAULT - The specified lpcsAddress, lpProtocolInfo, and lpszAddressString are not all in the address space of the process, or the lpszAddressString buffer is too small. Pass in a larger buffer" m'est retournée.
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 :
  1. struct sockaddr_in6 addr_6;
  2. int addr_6_size = sizeof(addr_6);
  3. if (addressType == IPV6)
  4. {
  5.     if(WSAStringToAddress(structure->addressStr, AF_INET6, NULL, (struct sockaddr *)&addr_6, &addr_6_size) != 0)
  6.     {
  7.      printf("Erreur WSAStringToAddress : %d \n", WSAGetLastError());
  8.      }
  9. connection->mediaAddressIPV6 = addr_6.sin6_addr;
  10. }


 
Ici, aucune erreur et l'adresse IPv6 apparait bien dans l'ordre "réseau" dans la structure sockaddr_in6.


Message édité par Joker28 le 01-07-2008 à 15:20:50
Reply

Marsh Posté le 01-07-2008 à 14:44:35   

Reply

Marsh Posté le 01-07-2008 à 15:20:28    

J'ai trouvé la solution si ça peut intéresser :
 
Il faut IMPERATIVEMENT initialiser TOUS les champs de la structure sockaddr_in6 (sin6_addr, sin6_family, sin6_port, sin6_flowinfo, sin6_scope_id)  :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed