Problem mit GetAddrInfo
-
Hi,
ich versuche gerade einen Hostnamen in eine IP-Adresse umzuwandeln, laut Doku ist die Funktion gethostbyname veraltet(unterstützt kein UNICODE) und es wird empfohlen die Funktion GetAddrInfo zu benutzen. Also die Doku geöffnet und nach GetAddrInfo gesucht, angeblich werden folgende Betriebssysteme unterstützt:
Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95Und nun mein Problem, der Compiler findet zwar die getaddrinfo Funktion aber leider unterstützt diese kein UNICODE(laut der Offline PSDK-Doku sollte sie das aber schon)... also in die ws2tcpip.h Datei geschaut und siehe da:
WINSOCK_API_LINKAGE int WSAAPI getaddrinfo( IN const char FAR * nodename, IN const char FAR * servname, IN const struct addrinfo FAR * hints, OUT struct addrinfo FAR * FAR * res ); #if (_WIN32_WINNT >= 0x0502) WINSOCK_API_LINKAGE int WSAAPI GetAddrInfoW( IN PCWSTR pNodeName, IN PCWSTR pServiceName, IN const ADDRINFOW * pHints, OUT PADDRINFOW * ppResult ); #define GetAddrInfoA getaddrinfo #ifdef UNICODE #define GetAddrInfo GetAddrInfoW #else #define GetAddrInfo GetAddrInfoA #endifDie Funktion die UNICODE(GetAddrInfoW) unterstützt gibt es anscheinend nur für Win2003 oder versteh ich da was falsch? Selbst wenn ich die _WIN32_WINNT Version auf 0x0502 setze findet der Compiler sie nicht!
-
0xDEADBEEF schrieb:
Die Funktion die UNICODE(GetAddrInfoW) unterstützt gibt es anscheinend nur für Win2003 oder versteh ich da was falsch? Selbst wenn ich die _WIN32_WINNT Version auf 0x0502 setze findet der Compiler sie nicht!
Ich würde mal ganz grob Tippen: Das ist ein Documentation-Bug... in Deiner MSDN-Library...
In der Online-Version wurden die beiden Funktionen getrennt und die "GetAddrInfoW" hat jetzt die richtige Doku:
http://msdn2.microsoft.com/en-us/library/ms738519.aspxFolgendes Code wird bei mir (VC8) aber ohne Probleme compiliert/gelinkt:
#define _WIN32_WINNT 0x0502 #include <winsock2.h> #include <Ws2tcpip.h> #include <tchar.h> #pragma comment(lib, "ws2_32.lib") int _tmain() { GetAddrInfoW(NULL, NULL, NULL, NULL); }
-
Komisch, die Windowsversion hab ich auch auf 0x0502 gesetzt aber der Compiler findet die Funktion einfach nicht. In der IDE werden die Funktionsdeklarationen nur grau dargestellt(ws2tcpip.h->GetAddrInfo). Gibt es keine andere Möglichkeit einen Hostnamen in eine IP-Adresse umzuwandeln? Denn soweit ich das beurteilen kann ist die Mindestanforderung dann für das Programm Win2003(0x0502) aber in der Doku im Internet steht: "Requires Windows Vista or Windows XP SP2"
WinXP == 0x0501
Win2003 == 0x0502oder lieg ich da falsch?
-
Das Problem mit den Macros ist, dass es (noch) keine Macros für SPs gibt... die gibt es erst mit dem Vista PSDK.
Siehe: Using the Windows Headers
http://msdn2.microsoft.com/en-us/library/aa383745.aspxNote that some features introduced in the latest version of Windows may be added to a service pack for a previous version of Windows. Therefore, to target a service pack, you may need to define _WIN32_WINNT with the value for the next major operating system release. For example, the GetDllDirectory function was introduced in Windows Server 2003 and is conditionally defined if _WIN32_WINNT is 0x0502 or greater. This function was also added to Windows XP SP1. Therefore, if you were to define _WIN32_WINNT 0x0501 to target Windows XP, you would miss features that are defined in Windows XP SP1.
Und Dein Kommentar bzgl. Vista und XP-SP2 verstehe ich nicht ganz...
Du hast vermutlich nur *eine* Zeile gelesen (die *Client* Zeile). Da gibt es aber auch noch eine *Server* Zeile:Requires Windows Server "Longhorn" or Windows Server 2003
-
danke für die Antwort und den Link, hast recht hab nur auf die clientspezifikationen geachtet. Ich hab den Fehler nun gefunden, hab bei den präprodirektiven in den Projekteinstellungen _WIN32_WINNT 0x0502 anstatt _WIN32_WINNT=0x0502 geschrieben...