ai_canonname
-
hi, hilfe,
warum kann "cout<<res->ai_canonname" nichts ausgeben?struct addrinfo* res = NULL; if (getaddrinfo(host_info->h_name,NULL,NULL,&res)) { cerr<<"\ngetaddrinfo() error!\n"; return 1; } res->ai_flags = AI_CANONNAME; cout<<"canonname: "<<res->ai_canonname<<endl;
vielen Dank!
-
man: getaddrinfo:
Erstens solltest du die Flags setzen, bevor du die Adressinfo abfragst und zweitens solltest du diese Flags auch (als vorletzten Parameter) übergeben:
-
Es funktioniert!!!
vielen Dank, aber warum? vielleicht kannst du mir genau erklären?
struct addrinfo hints; struct addrinfo* res = NULL; memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_CANONNAME; hints.ai_family = PF_INET; hints.ai_socktype = SOCK_STREAM; if (getaddrinfo(host_info->h_name,NULL,&hints,&res)) { cerr<<"\ngetaddrinfo() error!\n"; return 1; } cout<<"canonname: "<<res->ai_canonname<<endl;
-
Wenn du jetzt noch etwas Speicher anlegst, auf den hints verweisen kann, sollte es funktionieren. (aktuell ist der Pointer nicht initialisiert, zeigt also irgendwo in den RAM).
-
memset(&hints, 0, sizeof(hints));
meine Meinung nach ist copy '\0' zu hints, aber hint ist ein struct, so finde ich solche schreibeweise nicht schön. gibt es andere Möglichkeit?2, wenn ich 'hints' pointer deklariere : struct addrinfo* hints; wie geht's weiter? (wie kann ich dem zuweisen?)
3, wenn ich nicht AI_CANONNAME ansetze, wie ist die Returnwert von getaddrinfo?
dank sehr
-
Leg mal lieber hints als Objekt an statt als Pointer an:
struct adrinfo hints={0}/*initialisiert mit 0-Werten*/,*res=NULL; hints.flags=AI_CANONNAME; getaddrinfo(host,server,&hint,&res); cout<<res->ai_canonname<<endl;
PS: Und schau dir mal die oben verlinkte Manual-Page zu getaddrinfo an
-
"Erstens solltest du die Flags setzen, bevor du die Adressinfo abfragst und zweitens solltest du diese Flags auch (als vorletzten Parameter) übergeben:"
so schöne Erklärung habe ich nie erlebt !!!
vielen Dank CStoll