SDL_net BigEndian/SmallEndian Konvertierung funktioniert nicht



  • Hi,
    bin ein wenig ratlos. Ich möchte eine Netzwerkverbindung herstellen, aber SDLNet_Write32() scheint nicht zu funktionieren. Wenn ich z.B. die IP "10.11.12.13" an folgende Funktion übergebe:

    bool GLNet::add(unsigned char IP1, unsigned char IP2, unsigned char IP3, unsigned char IP4, bool server, std::string userName, int ping, double lastAnswer)
    {
        //IP konvertieren
        Uint32 IP = (IP1 << 24) + (IP2 << 16) + (IP3 << 8) + IP4 ;
        unsigned char Puffer[4] = {0};
        SDLNet_Write32(IP, Puffer);
        IPaddress Adresse;
        Adresse.host = (Puffer[0] << 24) + (Puffer[1] << 16) + (Puffer[2] << 8) + Puffer[3];
        Adresse.port = Port;
    
        //Schauen ob Server oder Client hinzugefügt wird
        if(server)
        {
            if(NumberServer <= 255)
            {
                //In Adressdatenbank eintragen
                ServerIP[NumberServer] = Adresse;
                ServerName[NumberServer] = userName;    //Entweder ein Name gesetzt oder ist leer
                ServerPing[NumberServer] = ping;    //Entweder ein Ping gesetzt oder ist 0
                if(lastAnswer != -1) LastServerAnswer[NumberServer] = lastAnswer; else LastServerAnswer[NumberServer] = Time->getGametime();
                NumberServer++;
                return true;
            } else {
                return false;
            }
        } else {
            if(NumberClients <= 255)
            {
                //In Adressdatenbank eintragen
                ClientIP[NumberClients] = Adresse;
                ClientName[NumberClients] = userName;    //Entweder ein Name gesetzt oder ist leer
                ClientPing[NumberClients] = ping;    //Entweder ein Ping gesetzt oder ist 0
                if(lastAnswer != -1) LastClientAnswer[NumberClients] = lastAnswer; else LastClientAnswer[NumberClients] = Time->getGametime();
                NumberClients++;
                return true;
            } else {
                return false;
            }
        }
    }
    

    und mit dieser Funktion wieder auslese:

    std::string GLNet::getClientIP(int number)
    {
    	//Abbrechen wenn kein Eintrag oder ungültige Adresse
    	if(NumberClients == 0 || number > NumberClients || number < 0) return "Keine IP/No IP";
    
    	//IP konvertieren
    	IPaddress Adresse = ClientIP[number];
    	Uint32 IP = SDLNet_Read32(&Adresse.host);
    	//Uint32 IP = Adresse.host;
    	int IP1 = (IP & 0xFF000000) >> 24;
    	int IP2 = (IP & 0x00FF0000) >> 16;
    	int IP3 = (IP & 0x0000FF00) >> 8;
    	int IP4 = (IP & 0x000000FF);
    
    	std::stringstream KonvStream1;
    	KonvStream1 << IP1;
    	std::string ip1 = KonvStream1.str();
    
    	std::stringstream KonvStream2;
    	KonvStream2 << IP2;
    	std::string ip2 = KonvStream2.str();
    
    	std::stringstream KonvStream3;
    	KonvStream3 << IP3;
    	std::string ip3 = KonvStream3.str();
    
    	std::stringstream KonvStream4;
    	KonvStream4 << IP4;
    	std::string ip4 = KonvStream4.str();
    
    	std::string Text;
    	Text = ip1;
    	Text += ".";
    	Text += ip2;
    	Text += ".";
    	Text += ip3;
    	Text += ".";
    	Text += ip4;
    
    	return Text;
    }
    

    erhalte ich "13.12.11.10" als Ausgabe. Kommentiere ich hier im Forum die Zeile 8 aus und nehme die Kommentierung bei Zeile 9 weg, so dass ich ohne Endianumwandlung direkt aus dem Speicher auslese, erhalte ich "10.11.12.13" als Ausgabe.
    Das bedeutet also SDLNet_Write32() konvertiert nicht, obwohl mein PC ja SmallEndian ist und das Netzwerk BigEndian braucht. SDLNet_Read32() konvertiert aber.
    Ich finde keinen Fehler meinerseits, aber sowohl unter Linux, als auch unter Windows erhalte ich den gleichen Fehler. Und da ich davon ausgehe, dass SDL_net kein unbekannter gravierender Fehler innewohnt, müsste der Fehler doch bei mir liegen. 😉
    Hat jemand ne Idee, wo ich eventuell falsch bitshifte oder ähnlich?

    Wär echt schön wenn ich das ganze mal an nem echten Netzwerk testen könnte. 🙂


Anmelden zum Antworten