Datenversand über SDL_net [gelöst]
Verfasst: 22.06.2011, 14:34
Hi,
ich weiß nicht warum, aber ich bastel seit Wochen herum und bekomme nicht einmal ein Byte über SDL_net versendet. Ich habe eine Client- und eine Serverversion meines Programms, welche über UDP laufen. Nach viel Gebastel (weil SDL_net bei mir sowohl unter Windows, als auch unter Linux die Bytereihenfolge nur bei den Read16/32 und nicht bei den Write16/32 umdreht bzw. anpasst) erhält mein Server auch UDP-Pakte von meinem Clienten. Doch ich schaffe es beim besten Willen nicht, auch nur ein einzelnes Byte oder gar einen umgewandelten String zu versenden.
Ich bin mir auch nicht sicher, ob ich den Paket->data Zeiger richtig verwende. Laut Doku ist dies ein Uint8* also quasie ein char* Zeiger. Schreibe ich meine Daten an die Adresse von Paket->data erhalte ich einen Speicherzugriffsfehler. Also liegt dort wohl kein reservierter Speicher vor. Weise ich Paket->data die Adresse des erstes Bytes meiner Daten, oder, im einfachsten Fall, meines einzigen Bytes zu, passiert trotzdem noch nichts.
Beim Lesen des empfangenen Paketes greife ich einfach auf die Zeigeradresse zu, dort ich erhalte dort nie etwas.
Hier meine Testsendefunktion:
Die Empfangesfunktion und die Funktion welche sie aufruft:
Mache ich selbst bei diesen einfachen Konvertierungen etwas falsch oder benutzte ich den Paket->data Zeiger einfach nur falsch? Kennt sich damit irgendjemand aus? Allgemein gibt es außer der Doku und einem einzigen, nicht viel sagendem, Tutorial scheinbar nichts über SDL_net im Internet. Würde mich freuen, wenn jemand weiter weiß. :-)
ich weiß nicht warum, aber ich bastel seit Wochen herum und bekomme nicht einmal ein Byte über SDL_net versendet. Ich habe eine Client- und eine Serverversion meines Programms, welche über UDP laufen. Nach viel Gebastel (weil SDL_net bei mir sowohl unter Windows, als auch unter Linux die Bytereihenfolge nur bei den Read16/32 und nicht bei den Write16/32 umdreht bzw. anpasst) erhält mein Server auch UDP-Pakte von meinem Clienten. Doch ich schaffe es beim besten Willen nicht, auch nur ein einzelnes Byte oder gar einen umgewandelten String zu versenden.
Ich bin mir auch nicht sicher, ob ich den Paket->data Zeiger richtig verwende. Laut Doku ist dies ein Uint8* also quasie ein char* Zeiger. Schreibe ich meine Daten an die Adresse von Paket->data erhalte ich einen Speicherzugriffsfehler. Also liegt dort wohl kein reservierter Speicher vor. Weise ich Paket->data die Adresse des erstes Bytes meiner Daten, oder, im einfachsten Fall, meines einzigen Bytes zu, passiert trotzdem noch nichts.
Beim Lesen des empfangenen Paketes greife ich einfach auf die Zeigeradresse zu, dort ich erhalte dort nie etwas.
Hier meine Testsendefunktion:
Code: Alles auswählen
void GLNet::SendUDP(void* daten, int laenge)
{
//Wenn keine UDP-Verbindung, abbrechen
if(State == 0 || State == 1 || State == 2) return;
Uint8 Zahl = 5;
Uint8* Zahlzeiger = &Zahl;
Packet->data = Zahlzeiger;
Packet->len = 1;
//Wenn UDP-Server, an alle Clients senden, sonst an alle Server
if(State == 3 || State == 5 || State == 7)
{
for(int i = 0; i < NumberClients; i++)
{
//IP zuweisen
Packet->address.host = ClientIP[i].host;
Packet->address.port = ClientIP[i].port;
//An eine Adresse (Client) senden
SDLNet_UDP_Send(UDPSocket, -1, Packet);
}
} else {
for(int i = 0; i < NumberServer; i++)
{
//IP zuweisen
Packet->address.host = ServerIP[i].host;
Packet->address.port = ServerIP[i].port;
//An eine Adresse (Server) senden
SDLNet_UDP_Send(UDPSocket, -1, Packet);
}
}
//Zeiger auf temporäre Variablen löschen
Packet->data = 0;
}
Code: Alles auswählen
bool GLNet::RecvUDP(void* daten, int& maxlaenge, int& number, bool& server) //Liefert true zurück, wenn neue Daten vorhanden (z.B. für Abfrageschleife)
{
//Wenn keine UDP-Verbindung, abbrechen
if(State == 0 || State == 1 || State == 2) return false;
if(SDLNet_UDP_Recv(UDPSocket, Packet) != 1) return false;
daten = (void*)Packet->data;
maxlaenge = Packet->len;
return true;
}
if(Netzwerk.RecvUDP(Daten, Laenge, SourceNumber, Server) && SourceNumber != -1)
{
//Daten konvertieren
std::string Stringtext;
if(*Daten == 5)
Stringtext = "Juhu!";
else
Stringtext = "Mist!";
std::string Ausgabe = "Empfangen: ";
Ausgabe += Stringtext;
Output.writel(Ausgabe, 0, 1);
}