2010-03-10 9 views
8

Je convertis du code écrit pour un système Linux en un système Windows. J'utilise C++ pour mon système Windows et je voulais connaître l'équivalent de la fonction inet_aton.windows equivalent de inet_aton

Répondre

8

Windows prend en charge inet_pton, qui possède une interface similaire à inet_aton (mais qui fonctionne également avec les adresses IPV6). Fournissez simplement AF_INET en tant que premier paramètre, et cela fonctionnera normalement comme inet_aton. (Si vous pouvez changer la source Linux, inet_pton fonctionnera également ici).

+5

Mais c'est seulement à partir de Vista et au-dessus. sur Windows XP, il échouera à charger. –

10

C'est l'équivalent de Windows plutôt que l'équivalent C++, mais probablement vous voulez inet_addr, qui je crois est antérieure à inet_aton et ce qui Windows prend en charge.

http://msdn.microsoft.com/en-us/library/ms738563.aspx

Cet article énumère également, dans la section « Voir aussi », l'ensemble des fonctions verbeux nommées pour gérer les adresses IPv6 et ainsi de suite.

+0

Une fois que je l'utilise inet_addr et définir le membre s_addr de la struct in_addr avec la valeur de retour, ce sont les deux autres membres du syndicat de la struct in_addr? Je ne suis pas tout à fait sûr de ce que ces (S_un_b et S_un_w) doivent être réglés. – SSS

+0

Je suppose que je peux juste utiliser le type struct sockaddr par opposition au type sockaddr_in et donc ne pas avoir à se soucier de S_un_b et S_un_w .... bien que je voudrais toujours savoir à quoi ils servent. Merci. – SSS

+0

Aussi, je ne sais pas pourquoi j'ai oublié le fait que c'est un syndicat. Je suppose qu'aucune autre explication n'est nécessaire. – SSS

1

Pour fonctionner sous Windows XP, vous pouvez essayer cette vérification:

#pragma comment(lib, "Ws2_32.lib") 

sockaddr_in inaddr; 

#ifdef _WIN32_WINNT 0x0501 
    inaddr.sin_addr.s_addr =inet_addr("10.10.10.10"); //for XP 
#else 
    inet_pton(AF_INET, "10.10.10.10", &inaddr.sin_addr.s_addr); //for Vista or higher 
#endif