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

1

02.11.2011, 22:21

Structuren per Winsock

Hallo ich habe folgendes Problem:

Ich versuche relativ Große Strukturen (3500 Bytes ca) per Winsock zu versenden.
Das Problem ist nur das insbesondere bei leuten mit schlechtem Internet diese Struktur in kleinere Pakete zerlegt wird.

Ich habe also keien Chance die Struktur im ganzen wieder Auszulesen.

Hat jemand eine Idee wie ich entweder dafür sorgen kann das die Struktur nicht auf mehrere Pakete aufgeteilt wird,
oder wie ich mehrere Pakete wieder zu "einer" Struktur zusammenfügen kann?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

02.11.2011, 22:38

TCP, UDP oder eines der andern möglichen Protokolle? Außerdem solltest du immer mit eigenen "Paketen" (sprich am anfang die Größe übermitteln) und einem Empfangsbuffer arbeiten. Desweiteren solltest du ggf über die Nutzung fertiger libs nachdenken, außer du machst das zu Lernzwecken und bist bereit ein paar Monate deines Lebens dafür zu investieren.

EDIT: natürlich kannst du auch vorher immer testen wieviel empfangsbereit ist, aber sollte das Paket größer als der recv buffer sein, gehts schief.
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.

3

02.11.2011, 22:45

Ich benutzt TCP.

Kannst du mir den namen einer solchen fertigen LIB nennen? (Auch wenn es schade ist alles umzubauen wo der Netzwerk code eigentlich fertig ist^^)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

02.11.2011, 22:52

Wenn das noch ein Problem von deinem Code ist, dann gibt es vermutlich noch einige andere Fälle an die noch nicht entsprechend behandelt werden ;) . http://content.gpwiki.org/index.php/Libraries#Networking hier gibt es einiges. Ansonsten je nach Anforderung. Wenn es um die Synchronisierung vieler Objekte geht, könnte syncsys ein Blick wert sein. Ansonsten kann ich ENet bzw. IrrNetLite empfehlen.
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.

5

02.11.2011, 23:06

Naja man kann Problemlos mit bis zu 16 Leuten gleichzeitig Spielen. Nur nerven halt diese Zerstückelten Pakete die ich immer rausfiltern muss. Bei leuten mit W-Lan ist es extrem krass. Da kommt extrem viel Datenmüll rüber.

Aber danke für die Links ich gucks mir mal an.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

6

02.11.2011, 23:13

Rausfiltern musst du die nicht. Du musst sie nur wieder zusammensetzen. TCP garantiert dir, dass die Pakete in der richtigen Reihenfolge ankommen.

Wie Nox schon geschrieben hat ist es am sinnvollsten als erstes die größe des Pakets zu senden und darauf folgend dann die Daten. Dann weißt du beim empfangen, ob du das Paket komplett hast und weiter verarbeiten kannst, oder ob du noch mehr Daten empfangen musst.

7

02.11.2011, 23:52

Die Größe des Pakets ist kein Problem. Die ist immer gleich.

Ich hatte mal versucht die Pakete wieder zusammen zusetzten. Nur leider habe ich das nicht hinbekommen.

kann mir jemand "in etwa" sagen wie ich das hinbekomme?

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

8

03.11.2011, 00:02

Du erstellst dir irgendwo einen Puffer in dem du paketstücke zwischenspeicherst. Außerdem brauchst du noch eine variable in der du speicherst wie viele Daten schon im Puffer sind (quasi die schreib Position). Wenn Daten kommen speicherst du die im Puffer an der aktuellen Position und erhöhst die Position entsprechend. Wenn ein komplettes Paket da ist kopierst du dir die Daten aus dem Puffer und verschiebst den Rest der Daten im Puffer an den Anfang.

So hab ich das immer gemacht. Wenn aber jemand nen besseren weg kennt immer her damit

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

03.11.2011, 10:53

Variante 1:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
if(!this->got_header)
    expected_size;
    ret = recv(this->socket, &expected_size, sizeof(), MSG_PEEK);
    if(ret == sizeof())
           recv(this->socket, &expected_size, sizeof(),0);
           buffer.resize(expected_size);
           this->got_header = true;
else    
    ret = recv(this->socket, &buffer.ptr(), buffer.size(), MSG_PEEK);
    if(ret ==  buffer.size())
          recv(this->socket, &buffer.ptr(), buffer.size(), 0);
          got_header = false;
          process(buffer);


Variante 2:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
ret = recv(this->socket, &this->buffer.ptr()+this->write_offset, this->buffer.freesize(), 0);
this->write_offset += ret;

if(!this->got_header)
    this->header.parse(buffer);
    this->buffer.remove_read_bytes();
    this->got_header=true;
if(this->got_header && this->write_offset >=  this->header.size())
     got_header = false;
     process(buffer,this->header.size());


Alles mehr oder weniger aus dem Stehgreif, sicherlich nicht korrekt und garantiert nicht die einzigen möglichen Varianten.
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.

Werbeanzeige