Immer NULL bei gethostbyname

dawn_of_death

Grünschnabel
Hallo,
ich will ein kleines windows socket-Programm schreiben und benutze dev-c++.

Dabei will ich erst einmal die IP eines Servers ermitteln und benutze folgenden Code:

const char *hostname;
hostname="whois.internic.net";

hostent* host;

host = gethostbyname(hostname);

if(host == NULL)
{
MessageBox(hwnd,"NULL","Help",MB_ICONINFORMATION);
}
else{
MessageBox(hwnd,host->h_addr,"Help",MB_ICONINFORMATION);

}


Ich erhalte aber imer als ergebnis NULL von gethostbyname, egal welchen server ich angebe.

Was mache ich falsch?

Danke
 
Hey ich glaube nicht dass du schon in der MSDN nachgelesen hast...

a) Du solltest getaddrinfo verwenden da gethostbyname veraltet ist.

b) Dann gibts da immer noch WSAGetLastError() um nachzusehen was schief gegangen ist!

Falls du mit C++ arbeitetst sags nochmal dann kann ich dir mal nen Ausschnitt aus meinem Code anbieten.
 
moin


gethostbaname kann man immer noch ohne Probleme benutzen.
Du musst aber den Socket kram initialisieren:
- winsock2.h einbinden
- ws2_32.lib einbinden
- WSAStartup() aufrufen

Dann sollte es eigentlich gehen.


mfg
umbrasaxum
 
Danke,
ich bin ein absoluter ie in der Windows Programmierung mit c++ und habe versucht mich mit Beispielcodes durchzuhangeln. Habe vorher nur dos anwendungen programmiert.
dev-c++ liefert ja ein ganzes Gerüst für windows appl.
Wenn ich mir den WSAGetLastError(); ansehen will stürtzt mein Programm ab:

int connection(HWND hwnd)
{
int fehlernummer;
const char *hostname;
hostname="whois.internic.net";

hostent* host;

host=gethostbyname(hostname);
fehlernummer=WSAGetLastError();

if(host == NULL)
{

MessageBox(hwnd,(const char*) fehlernummer,"Help",MB_ICONINFORMATION);
return 0;
}
else{
MessageBox(hwnd,host->h_addr,"Help",MB_ICONINFORMATION);
return 0;
}
}

Als Include eingebunden:
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>:


Eingebunden habe ich beim Linken:
C:/Programme/Dev-Cpp/lib/libwsock32.a
C:/Programme/Dev-Cpp/lib/libnetapi32.a
C:/Programme/Dev-Cpp/lib/libwininet.a
C:/Programme/Dev-Cpp/lib/libws2_32.a

Komme damit aber nicht so recht weiter.

Danke
 
Man kann es schon noch benutzen aber wenn die MSDN sagt getaddrinfo wär besser dann hör ich da drauf. Ich bin mir immer noch net sicher ob du mit c++ arbeitest oder nur c.

Ich hab das in meinem Projekt so realisiert - Die Lösung ist sicher nicht perfekt, bin selber auch Einsteiger in Netzwerkprogrammierung.

Code:
namespace socketlib {

	class Address
	{
		public:
			
			// Konstruktoren
			Address(std::string const& ip);
			Address(unsigned long ip);
			Address(in_addr const& ip);
			
			// Gibt die IP als String zurück
			std::string getAddress() const;

			// Zur Verwendund mit Winsock
			operator in_addr() const;

		private:

			// Addresse
            unsigned char mAddress[4];

	};

	// Löst einen Hostname auf und gibt die IPs im Vektor zurück
	std::vector<Address> resolveHostname(std::string host);

}

////////////////////////////////////////////////////////////////

namespace socketlib {
	
	Address::Address(std::string const& ip)
	{
		std::strstream stream;
		stream << ip;
		for(int i=0; i<4; ++i)
			stream >> mAddress[i];
	}

	Address::Address(unsigned long ip)
	{
		*reinterpret_cast<unsigned long*>(mAddress) = ip;
	}

	Address::Address(in_addr const& ip)
	{
		for(int i=0; i<4; ++i)
			mAddress[i] = (&ip.S_un.S_un_b.s_b1)[i];
	}

	std::string Address::getAddress() const
	{
		std::ostrstream stream;
		stream << static_cast<int>(mAddress[0]) << '.' 
			<< static_cast<int>(mAddress[1]) << '.' 
			<< static_cast<int>(mAddress[2]) << '.' 
			<<static_cast<int>(mAddress[3]) << '\0';
		return stream.str();
	}

	Address::operator in_addr() const
	{
		in_addr value;
		for(int i=0; i<4; ++i)
			 (&value.S_un.S_un_b.s_b1)[i] = mAddress[i];
		return value;
	}


	std::vector<Address> resolveHostname(std::string host)
	{
		addrinfo* data;
		int result = getaddrinfo(host.c_str(), NULL, NULL, &data);
		// Ausnahme wenn getaddrinfo fehlschlägt
		if(result != 0)
		{
			throw WinsockException(result);
		}
		// Elemente in Vektor hinzufügen
		else
		{
			std::vector<Address> vec;
			addrinfo* p = data;
			while(p)
			{
				sockaddr_in* ip = reinterpret_cast<sockaddr_in*>(p->ai_addr);
				vec.push_back(ip->sin_addr);
				p = p->ai_next;
			}
			freeaddrinfo(data);
			return vec;
		}
	}

}
 
MessageBox(hwnd,"NULL","Help",MB_ICONINFORMATION);



liegt das denn nich auf der hand warum dort immer NULL kommt?

ich würde am liebsten mal "NULL" durch den text ersetzen ;)
 
bloodriver hat gesagt.:
MessageBox(hwnd,"NULL","Help",MB_ICONINFORMATION);



liegt das denn nich auf der hand warum dort immer NULL kommt?

ich würde am liebsten mal "NULL" durch den text ersetzen ;)
Hi.

Erstens mal ist der Thread schon etwas älter aber OK.

Dann hast du offensichtlich übersehen, dass die Funktion nur so (mit "NULL" als zweitem Parameter) aufgerufen wird, wenn host == NULL ist denn da ist eine if-Abfrage vor dieser Zeile; sollte host != NULL sein, wäre der Hostname schon ausgegeben worden...
 
Zurück