Zugriffsverletzung bei simpler übergabe "h_addr_list"



  • Hi

    ich versuche mich gerade in OOP mit c++ und versuche anhand des Socket Artikels hier im forum eine Klasse selbst zu bauen und so die Theorien aus den Klassen-Tutorials im netz in die tat umzusetzen.

    Jetzt hängt sich aber mein Programm an der genannten stelle im topic auf. Und ich weiß nicht woran das liegt.

    Die klasse befindet sich noch einem sehr frühen stadium und ich lerne gerade noch mit klassen umzugehen, also entschuldigt die vieleicht konfuse art des quellcodes.

    Hier mal das komplette projekt

    main.cpp

    #include <iostream>
    #include <string>
    
    #include "http.h"
    
    int main(void)
    {
    	http HTTP;
    	std::string page = HTTP.GET("www.google.de");
    
    	system("pause");
    	return 0;
    }
    

    http.h

    #include <string>
    #include <winsock2.h>
    
    #pragma comment(lib, "WS2_32.lib")
    
    class http
    {
    	/* Private Variablen */
    private:
    	bool initialized;
    	hostent* p_hostent;
    
    	/* Private Methoden */
    private:
    	bool init();
    	bool resolveHost(std::string host);
    	bool request(std::string uri);
    
    	/* Öffentliche Variablen */
    public:
    	std::string Hostname;
    	std::string Aliases;
    
    	/* Öffentliche Methoden */
    public:
    	http();
    	std::string GET(std::string URI);
    };
    

    http.cpp

    #include "http.h"
    #include <string>
    #include <iostream>
    
    http::http()
    {
    	initialized = false;
    }
    
    std::string http::GET(std::string URI)
    {
    	if (request(URI))
    		return "Done\n";
    	else
    		return "Nothing...\n";
    }
    
    bool http::request(std::string uri)
    {
    	if (!initialized)
    		init();
    
    	int Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if (Socket == -1)
    	{
    		std::cout << "Socket konnte nicht erstellt werden!" << std::endl;
    		return false;
    	}
    
    	sockaddr_in service;
    	service.sin_family = AF_INET;
    	service.sin_port = htons(80);
    
    	char** p_AdressList = p_hostent->h_addr_list;
    	int result;
    	do
    	{
    		if (*p_AdressList == NULL)
    		{
    			std::cout << "Verbindung fehlgeschlagen!" << std::endl;
    			return false;
    		}
    		service.sin_addr.s_addr = *reinterpret_cast<unsigned long*>(*p_AdressList);
    		++p_AdressList;
    		result = connect(Socket, reinterpret_cast<sockaddr*>(&service), sizeof(service));
    	} while (result == -1);
    	std::cout << "Verbindung erfolgreich!" << std::endl;
    
    	closesocket(Socket);
    	return true;
    }
    
    bool http::init()
    {
    	WSADATA w;
    	if (int result = WSAStartup(MAKEWORD(2, 2), &w) != 0)
    	{
    		std::cout << "Winsock 2 konnte nicht gestartet werden! Error #" << result << std::endl;
    		return false;
    	}
    	initialized = true;
    	return true;
    }
    
    bool http::resolveHost(std::string host)
    {
    	if (!initialized)
    		init();
    
    	p_hostent = gethostbyname(host.c_str());
    	if (p_hostent == NULL)
    	{
    		std::cout << "Host konnte nicht aufgelöst werden!" << std::endl;
    		return false;
    	}
    
    	Hostname = p_hostent->h_name;
    	for (char** alias = p_hostent->h_aliases; *alias != 0; ++alias)
    	{
    		Aliases += *alias;
    	}
    
    	if (p_hostent->h_addrtype != AF_INET)
    	{
    		std::cout << "Ungueltiger Adresstyp!" << std::endl;
    		return false;
    	}
    	if (p_hostent->h_length != 4)
    	{
    		std::cout << "Ungueltiger IP-Typ!" << std::endl;
    		return false;
    	}
    
    	return true;
    }
    


  • hab den fehler grad selbst gefunden

    ich hatte vergesse die url aufzulösen, hat also nur ein funktionsaufruf gefehlt.

    entschuldigt dass ich das nicht gesehen hab, damit wäre der thread hier erledigt und kann gelöscht/geschlossen werden

    gruß


Anmelden zum Antworten