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

killmichnich

unregistriert

1

04.04.2009, 11:27

struct und socket

Hallo Leute,
ich bin grad dabei, ein kleines online spiel mit directx und sockets zu schreiben. Jetzt bin ich auf ein kleines Problem gestoßen: Ich habe eine Struktur
struct Gegner {string name; int xpos; int ypos;};
in der ich Daten über die Gegner speichern will. Jetzt muss ich diese Struktur ja auch an meinen Server weiterschicken. Wie krieg ich das am Besten hin? Weil die methode send(...) erwartet ja ein char-array.
Und jetzt weiß ich nich was ich machen soll ...

Ich würde mich sehr über Hilfe freuen

MfG Daniel

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

04.04.2009, 11:29

Indem du die Daten serialisiert. Es handelt sich dabei um ein Standardproblem, was wohl im Inet oft gesprochen wird.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

3

04.04.2009, 11:51

Du könntest beispielsweise mit einer Union dein struct und ein char array passender Größe vereinen. Das char array kannst du dann verschicken und ansonten mit dem struct arbeiten... aber kA ob man das so macht, nur eine Idee :D

killmichnich

unregistriert

4

04.04.2009, 12:00

also das einzige(verständliche) das ich jetzt gefunden hab war sprintf(..), wobei ich nich weiß, wie ich das zeug da wieder "rauskriegen" soll

als wenn ich das so mach ...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
struct ...
{
...
union
{
int xpos;
char cxpos;
}
}


... meinst du dass ichs so verschicken könnte?

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

5

04.04.2009, 12:07

Nein, so wird es wohl nicht gehen, weil ein int ist (auf den meisten Systemen jedenfalls) 32bit groß, ein char normalerweise nur 8bit... du brauchst also vier. Ich würde es wohl in der Art machen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
union Test
    {
      int xPos; //Annahme: sizeof(int) == 4

      struct
      {
        char xpos1;
        char xpos2;
        char xpos3;
        char xpos4;
      } xpos;
      //char xpos[4]; //so könnte man es auch machen (statt struct)

    };

das char array xpos[] könntets du dann verschicken und auch wieder einzeln einlesen, und dann einfach mit deine_union_instanz.xPos normal als integer verwenden.

Edit: ich weiß nicht, ob in den Bibliotheken, die du verwendest schon auf die Art der Speicherung von Daten geachtet wird (Stichwort Little/Big Endian). Falls nicht, musst du selbst darauf achten, weil sonst werden die Werte, welche du verschickst unterschiedlich interpretiert... aber das ist jetzt nicht nur auf deinen Fall bezogen, sondern generell auf das Verschicken von Daten.

VuuRWerK

Frischling

Beiträge: 59

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

6

04.04.2009, 12:24

Anstatt wild mit unions (wobei man an der Stelle wo man an union denkt lieber zu boost::variant zurückgreifen sollte) herumzudoktorn wäre es für diesen Anwendungsfall wohl besser sich ein kleine Protokoll zu überlegen und dann auf Basis dieses Protokolls mit Client und Server zu kommunizieren. Denn Protokolle sind für genau diese Geschichten gedacht!

Gut Schuß
VuuRWerK ;)

killmichnich

unregistriert

7

04.04.2009, 12:32

ach und angenommen ich will jetzt die ganze struct in das array packen, ginge das dann iwie so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
struct test
{
union
{
struct Gegner{ string name; int xpos; int ypos;};
char cgegner[256];
};
};


?
klappt das auch so?

ach und VuuRWerK
wie genau meinst du das mit dem protokoll? oO

VuuRWerK

Frischling

Beiträge: 59

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

8

04.04.2009, 12:49

Du überlegst Dir was Du alles "transportieren" willst, Spielstände, Gegnerpositionen, Status, etc. Das verpackst Du dann in ein für Dich geeignetes Format. Ich z.B. bevorzuge immer XML aber auch CSV, binär (beim versenden dann aber auch aufs binär achten!) oder einfach eine sequentielle Anordnung bieten sich an, wie Dir halt beliebt.
Das ist dann qausi Dein Protokoll. Du entwickelst dafür dann eine Schnittstelle und implementierst diese und verwendest diese sowohl im Server als auch im Client. Somit weiß jede Gegenstelle was kommt an und was muss gesendet werden und vorallem wie.

Gut Schuß
VuuRWerK ;)

Anonymous

unregistriert

9

04.04.2009, 12:49

container wie strings kann man so nicht serialisieren.

killmichnich

unregistriert

10

04.04.2009, 12:52

ja das was ich verschicken will hab ich mir ja überlegt, und jetzt versuch ich halt das in dieser struct zu verschicken ... wie funktioniert das denn mit XML, hast du da ein tutorial o.ä.?

Werbeanzeige