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.