Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

SchlafMatze

Frischling

  • »SchlafMatze« ist der Autor dieses Themas

Beiträge: 5

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

1

15.01.2013, 20:55

SDL_Net: Versenden eines Arrays mit UDP_Send

Guten Abend zusammen :)

Es dreht sich um folgendes: Ich bastel gerade an einem kleinen Multiplayer-Game mit Hilfe der SDL bzw SDL_Net.
Jetzt habe ich eine Funktion geschrieben, mit der ich einen String zu einem Clienten schicken kann:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void send_string (char *pData, Uint32 target_host, Uint16 target_port, UDPsocket *pSocket)
{
    UDPpacket *pMemory; pMemory = SDLNet_AllocPacket(512);
     pMemory->data = pData;
     pMemory->address.host = target_host;
     pMemory->address.port = target_port;
     pMemory->len = strlen((char*)pMemory->data)+1;
     SDLNet_UDP_Send(*pSocket, -1, pMemory);
}



Der Aufruf wäre dann mit:

C-/C++-Quelltext

1
send_string("Hallo", Spieler1.chIP, Spieler1.chPort, &sock_server);



Das funktioniert auch einwand frei :)
Nun möchte ich aber ein Array oder evtl eine ganze Struktur verschicken und im Client dementsprechen wieder in ein Array/Struktur ablegen.
Allerdings bin ich hier mit meinem Latein am Ende.

Von der Idee her müsste ich ja eig den Pointer auf das erste Element des Arrays an die Funktion geben und die bastelt dann ein Paket, welches ich verschicken kann. Im Client müsste dann das Paket an die erste Stelle des Zielarrays geschrieben werden, da die Array-Elemente ja im Speicher direkt hintereinander liegen. So viel zur Theorie ;-)

Für jede Hilfe bin ich dankbar :)

LG Matze

P.S. Natürlich hab ich auch schon google befragt :P

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

16.01.2013, 10:54

Es ist sinnvoll wenn deine Objekte Funktionen zum schreiben und laden in einen Stream bekommen. Ansonsten kannst du aus Objekten natürlich auch Strings oder was auch immer generieren und verschicken. Für Arrays musst du dir halt was überlegen. Wenn du die Daten als String sendest kannst du die einzelnen Einträge zum Beispiel durch ein Komma trennen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

16.01.2013, 11:03

Und natürlich immer aufpassen, dass du keine Pointer verschickst.

Saik0

Treue Seele

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

4

16.01.2013, 11:07

Du könntest es aber auch mit dem JSON Format probieren. Dein Array kannst du dann als JSON in einem normalen String verschicken oder verwendest direkt ein JSONArray, wenn es mit der SDL funktioniert. Du müsstest dir dann nur noch überlegen, wie du das Format auf dem client auslesen kannst. Dafür gibt es aber auch genügen Parser und Beispiele im Netz.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

16.01.2013, 11:11

JSON ist aber nicht gerade platzsparend.
Also für ein Echtzeit-Multiplayer-Spiel eher nicht geeignet.

SchlafMatze

Frischling

  • »SchlafMatze« ist der Autor dieses Themas

Beiträge: 5

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

16.01.2013, 11:37

Erst einmal Danke für eure Antworten :thumbsup:
Ich hab jetzt mal die Idee von Schorsch aufgegriffen: Das Array wird als String versendet und die einzelnen Einträge werden durch "-" voneinander getrennt. Das erste Zeichen des Strings gibt die Länge des Arrays an, sodass der Client in einer Schleife das Zielarray mit den Werten füllen kann.
Meinungen dazu?
Wenn's funktioniert, poste ich den Code mal hier :)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

16.01.2013, 11:42

Dann kann ein String also maximal 255 Zeichen lang sein?
Alternativ kannst du auch einen String mit einer Null beenden.

SchlafMatze

Frischling

  • »SchlafMatze« ist der Autor dieses Themas

Beiträge: 5

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

18.01.2013, 16:51

So, ein kurzes Update.
Ich werde nun doch auf TCP umsteigen. Dort wird anstelle eines (char*) ein (void*) versendet, sodass ich unter Angabe der Länge alles versenden kann.
TCP sei zwar nicht so schnell, wie UDP jedoch ist dieses bei der Größe meines Projektes wohl vernachlässigbar. Außerdem ist das Umwandeln größerer Datenmengen, wie bspw. Arrays in einen String auch nicht gerade eine schöne Lösung. Von der Effizienz hier mal ganz zu schweigen ;-)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

18.01.2013, 17:10

Äh, was? Ich glaube Du hast da einen gigantischen Denkfehler. Du musst überhaupt nichts in Strings umwandeln, um Gottes Willen!
Da nimmt man einen Cast und interpretiert den Pointer neu. Nicht mehr und nicht weniger. Das braucht einen Bruchteil eines CPU-Takts (dank Pipelining). Das ist nicht mal messbar!
Bevor Du Dich mit Themen wie Netzwerk beschäftigst, solltest Du ganz dringend nochmal die Grundlagen der Sprache lernen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

18.01.2013, 18:03

Und was man so über TCP und UDP ließt ist auch mit Vorsicht zu genießen. Geschwindigkeit sollte in fast allen Fällen keine Rolle spielen. Viel wichtiger sind die anderen Eigenschaften. Wenn du Eigenschaften von TCP nachbauen möchtest wird das eigentlich immer langsamer laufen, als wenn du direkt TCP verwendest.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige