Probleme mit gethostbyname() - nicht null, aber müll
-
Mhallo mal wieder, ich hab ein Problem mit gethostbyname, aber davor noch a bisserl code:
. . // wsa startup hier . SOCKET testSock; // testsock testSock = socket(AF_INET,SOCK_STREAM,0); // socket erstellen, tcp/ip if (testSock == INVALID_SOCKET) { cout << "Error while Creating Socket occured \n\n"; wsaGetError(); return 0; } else { cout << "Socket opened!"; } // Socket connecten vorbereiten (vars abspeichern...); SOCKADDR_IN connectionAddr; // struct SOCKADDR_IN initialisieren memset(&connectionAddr,0,sizeof(SOCKADDR_IN)); // speicher leerräumen und vorbereiten connectionAddr.sin_family = AF_INET; connectionAddr.sin_port = htons(80); //Elementvars erhalten ihre notwendigen Werte //resolve address (by name) char *hostname; hostname = "www.heise.de"; HOSTENT* hp; //HOSTENT struct erstellen (hp) hp = gethostbyname(hostname); cout << (*hp).h_addr_list[0]; connectionAddr.sin_addr.s_addr = atol(hp->h_addr_list[0]); cout << "\n\n\nhier sollte die Addresse sein: " << connectionAddr.sin_addr.s_addr << "\n\n"; //connect socket long testVar; testVar = connect(testSock,(SOCKADDR*)&connectionAddr,sizeof(SOCKADDR_IN)); //connectebefehl mit pointerverweis . . //wsa close . return 0;So ich hab jetzt einfach mal heise.de genommen, weil sich des immer anbietet. Mein Problem: das, was da im Struct hp_addr_list[0]; gespeichert ist ist keinesfalls die Adresse im inet_addr() Format, sondern sieht so aus (bei Ausgabe mit "cout"), dass einfach auch www.heise.de dasteht, bloss mit 3 merkwürdigen sonderzeichen davor, die ich nicht einmal in einer Zeichentabelle gefunden habe. (ein seltsames c , über dem eine ± ist, darauf folgt ein "e" wie aus einer Fremdsprache.)
Woran kanns liegen, oder ist der Code einfach nur Dreck ?

-
Das stimmt schon soweit, die IP ist nicht in Buschtaben sondern als Zahl gespeichert...
änder dies mal
connectionAddr.sin_addr.s_addr = atol(hp->h_addr_list[0]);in
connectionAddr.sin_addr = *(in_addr*)hp->h_addr_list[0];
-
ahh funktioniert, danke, god :D, wenn du mir noch erklärst was es mit dem in_addr* auf sich hat werd ich nen kleinen Altar für dich errichten ^^
-
Das ist ein einfacher Cast in einen Pointer auf eine in_addr-Struktur, den du dann dereferenzierst - wenn mich nicht alles täuscht

-
dieser cast wäre nicht möglich:
(in_addr)hp->h_addr_list[0];deshalb wird das über einen Pointer gemacht...
in_addr ist im Grunde genommen einfach eine 4 Byte große Zahl. IPs werden mit Punkten geschrieben um dies für Menschen leichter lesbar zu machen - ein PC braucht sowas nicht - für ihn reicht einfnach die reine Zahl.
-
ahso sozusagen einfach nur ne feine konvertierungsanweisung

Danke euch beiden, <- me hat wieder etwas mehr verstanden