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

23.02.2009, 20:23

[Erledigt] boost.asio

Also, vllt. kennt sich hier ja einer mit boost.asio aus! :)

Es geht darum, dass ich per boost::asio::async_write eine Nachricht an meinen Server schicke. Soweit klar. Dann kommt bei dem auch was (sogar was korrektes!), aber ich lese halt in zwei Teilen mit boost::asio::async_read ein, und nicht direkt alles was geschickt wurden ist in einem Mal. Und damit scheint er nicht ganz klar zu kommen denn mir fehlt immer der zweite Teil bzw. wenn ich mitm Debugger drüber gehe hat er nachdem ich die Funktion das zweite Mal aufgerufen habe die Daten korrekt im Buffer, aber die Funktion die damit verknüpft wurde wird nie aufgerufen!

C-/C++-Quelltext

1
2
3
4
5
6
7
// parse char-array (message id, data length)

const std::size_t sizeof_data(*reinterpret_cast<std::size_t*>(&m_read[sizeof(Message::identification_t)]));
m_read.resize(Message::sizeof_header + sizeof_data, 0);
// continue reading message data

boost::asio::async_read(m_socket, 
    boost::asio::buffer(&m_read[Message::sizeof_header], sizeof_data),
    boost::bind(&Session::handle_read_body, this, boost::asio::placeholders::error));
(handle_read_body wird nie aufgerufen ...)


Jemand ne Idee? (is eigtl. dem chat-example nachempfunden)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

23.02.2009, 21:10

Ich bin ja erstaunt, dass du asio zum Kompilieren gebracht hast (bin damals dran gescheitert). Ich vermute, dass async_read vielleicht nur beim erhalten von neuen Nachrichten aufgerufen wird. Was sagt denn die Doku zu dem Thema? kannst du vielleicht mit einem sycn_read die restlichen empfangen Daten holen? Ist halt die Frage wie asio intern arbeitet...
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

23.02.2009, 21:52

Hm, jap war kein Problem :P

Also normal sollte von asio die Funktion die angebunden wurde aufgerufen werden, sobald Datenvorhanden sind ... hast ja diesen io_service und dessen run-Methode du einmal aufrufst und dann geht's los :P

Das komische ist, wenn ich hingehe und Debugge. So Step-für-Step durchgeh wird die erste Funktion die angebunden wurde aufgerufen (also nach dem Empfangen des ersten Teils). Dann wird dann unter anderem der Code-Snippet den ich vorhin schon gepostet hab aufgerufen. Nachdem ich dann diesen Code durchlaufen lassen habe, und dann mir den Inhalt von meinem Buffer anzeigen lasse, stehen da die korrekten Daten drin. Aber es wird halt nicht die zweite hinterlegte Funktion mehr aufgerufen ... Also handle_read_body.

Muss auch zugeben das ich's mir bissel einfach gemacht und im Prinzip mich an das Beispiel "chat" halt gehalten hab und da wird's genauso gemacht das beim schreiben alles geschickt wird und beim empfangen dann in zwei schritten weil ja die genaue Größte ja mit der Nachricht erst geschickt wird. Klar man kann einfach nen Maximum setzen aber das is etwas unschön ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

23.02.2009, 22:37

Im Zweifel würde ich das Tutorial nehmen kompilieren, testen ob es wirklich funktioniert und dann Schritt für Schritt vergleichen. Weil wenn du sagst, dass die 2. gebundene Funktion auch aufgerufen werden sollte bzw. das im Tutorial genauso ist, muss der Grund irgendwo in den Untiefen von asio liegen.
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.

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

5

23.02.2009, 23:44

Hab auch mal versucht asio zu verwenden.

Hatte dabei ziemlich das gleiche Problem wie du.

Ich musste einen 2-ten Thread aufmachen der immer

C-/C++-Quelltext

1
io_service.run()


ausführt wurde, wenn ich mich gerade recht erinnnere. Sonst hat asio immer nur das erste Datenpaket auf Empfängerseite abgearbeitet.

PS:
An deiner Stelle würde ich aber die Finger von asio lassen. Ich sowie meine Arbeitskollegen am Institut auf der Uni hatten nur Probleme mit dem Teil.

Z.B:
Als dann endlich alle Datenpakete zumindest ankamen, trat folgendes Problem auf:
Bei manchen Paketen die gesendet wurden, haben auf der Empfängerseite plötzlich Bytes gefehlt (schien irgendwie mit der gesendeten Datenmenge/Sekunde zusammenzuhängen).

Konnte leider auch keine Lösung für das Problem finden und hab asio dann als fehlgeschlagenes Experiment Ad acta gelegt.

mfg Philipp

6

24.02.2009, 10:52

Hm bis jetzt klappts bei mir ganz gut ^^ hab den Fehler jetzt gefunden und jetzt funktioniert es sauber und stabil :) Hatte bei der Längenangabe für die Daten nur nen Fehler gemacht und damit hat er noch auf Daten gewartet bevor die Funktion ausgelöst werden würde ... nja nu geht alles :)

Trotzdem danke für die HIlfe :)


PS: boost.asio is doch noch garnicht lange in boost.org aufgenommen?!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige