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


Anmelden zum Antworten