Soft Timeout C/C++ Netzwerk

ZeroByte
Beiträge: 25
Registriert: Mi 14. Sep 2011, 21:08

Soft Timeout C/C++ Netzwerk

Beitragvon ZeroByte » Sa 21. Jan 2012, 21:35

Moin,

ich bekomme nach wie vor ein Soft-Timeout, wenn ich mit meinem C++-Clienten (boost::asio Netzwerk, Zeitmessung per msec oder auch CLOCKS_PER_SEC über den Systemtakt) die 2 Sekunden halbwegs ausnutzen möchte.

Tests haben gezeigt, dass das Problem auch auftritt, wenn mein Client etwas völlig Sinnloses tut und einfach irgendeine (aber trotzdem valide) Antwort zurückliefert.
Ein neuer Ansatz ist, dass nicht die Zeitmessung per Boost Probleme macht, sondern dass die Kommunikation zwischen Java-Server und meinen Clienten problematisch ist. Dass es diese Problematik gibt, belegen unzählige Topics, die man per Google finden kann. Eine mögliche Fehlerquelle ist beispielsweise der Einsatz von Stream-Objekten, die für die Kommunikation zwischen Java-Programmen vorgesehen sind - aber _nicht_ für den Einsatz zwischen verschiedenen Sprachen. (siehe stackoverflow). Das muß nicht zwangsläufig zu Fehlern führen, allerdings gibt es genau 0 Sicherheiten, dass keine auftreten.

Ich habe schon versucht, den Puffer so vollzumüllen, dass er auf jeden Fall geleert werden muß ( 1 KB reingeschrieben) und die Antwort auf jeden Fall sofort zurück zum Server geht - leider ohne Erfolg.

Windows XP lässt lokale TCP-Verbindungen nicht über den regulären Netzwerkstack laufen, daher habe ich keine Möglichkeit, dies zu prüfen.

Mich würde jetzt vor allem interessieren, wie die anderen Teilnehmer mit C/C++ ihre Netzwerkkommunikation erledigen bzw. ob sie vor dem gleichen Problem stehen.

Mit freundlichen Grüßen

Benutzeravatar
Christian Wulf
Beiträge: 27
Registriert: Mi 31. Aug 2011, 05:54

Re: Soft Timeout C/C++ Netzwerk

Beitragvon Christian Wulf » Mi 22. Feb 2012, 09:44

Hallo ZeroByte,

Interessant. Ich habe zwar noch nie danach gesucht, allerdings wäre es fatal, wenn Streams absolut garnicht kompatibel zu anderen Sprachen wären. Hast du da mal ein paar Links?

Um eine Nachricht auf jeden Fall abzusenden, sodass der Puffer geleert wird, gibt es eigentlich in jeder Sprache eine Socket-Bibliothek, die auch den Befehl flush() zur Verfügung stellt. Aber da ich nichts genaueres über dein Problem weiß, möchte ich hier nicht zu viel mutmaßen.

Danke
Christian

FewKinG
Beiträge: 14
Registriert: Mi 16. Mär 2011, 16:25

Re: Soft Timeout C/C++ Netzwerk

Beitragvon FewKinG » Fr 24. Feb 2012, 12:45

Wir hatten letztes Jahr ein ähnliches Problem mit einem der Teilnehmer, der auch in C++ entwickelt hatte.
Dieser bekam auch unregelmäßig Softtimeouts. Diese schienen sogar häufiger aufzutreten, wenn viele Clients gleichzeitig gespielt haben (z.B. bei Wettkampfspielen). Wir haben schon damals eine Vielzahl von Versuchen unternommen, dem Problem auf die Spur zu kommen.

Es lag das gleiche Problem vor, dass die Angaben der Zeitmessung nicht mit den Messungen des Servers übereinstimmten.
Besonders auffällig war, dass die gemessenen Zeiten im Verlauf eines Spiels in den meisten Fällen zunächst sehr ähnlich waren (bis auf eine übliche geringe Netzwerklatenz). Im Laufe des Spiels stiegen die Differenzen dann oft an und es kam spitzenartig zu besonders großen Differenzen, die dann oft zu Softtimeouts führten. Das waren dann schon manchmal Differenzen von mehr als 500ms.

Untersucht haben wir auch, ob Server und Client tatsächlich die zu sendenden Daten korrekt flushen. Der Code sah diebezüglich aber auf beiden Seiten okay aus. Auch an der Art, wie die Zeitmessung im Javacode implementiert ist, haben wir nichts gefunden. Letztenendes konnten wir den Fehler nicht wirklich beheben. Der Teilnehmer hat seine Zugzeit dann auf etwa 1 Sekunde begrenzt, um genug Spielraum für Differenzen zu haben.

Ein Problem bei der Stream-Kommunikation zwischen dem C++-Client und dem Javaserver könnte die Probleme also durchaus erklären. Allerdings bin ich in der Thematik jetzt nicht so weit drin, dass ich konkrete Ursachen nennen oder beheben könnte. Da müsste ich erst ausgiebig recherchieren. Wenn du ein paar Referenzlinks bereitstellen könntest, wäre das sicherlich sehr hilfreich.

Anbieten könnte ich dir außerdem, mal für einige Testspiele die Differenzen der gemessenen Zugzeit auf Client- und Serverseite anhand der Serverlogs zu bestimmen, falls dir das weiterhilft.

Zur Überwachung des Netzwerktraffics unter Windows:
Wenn du einen Client im Server startest, wird sich dieser ja vermutlich auf localhost/127.0.0.1 verbinden? Nur eine Vermutung. Läuft der Traffic auch dann nicht über den regulären Stack, wenn du den Server und den Client getrennt startest und den Client auf deine tatsächlich IP-Adresse verbinden lässt? Ansonsten könntest du das doch mit einem zweiten (virtuellen/physikalischen) System im Netzwerk testen oder du sprichst dich mit einem Freund über Internet ab, der den Socha Server auf seinem PC laufen lässt und ihr protokolliert jeweils den Netzwerkverkehr auf beiden Seiten.

Viele Grüße,
Sven.

ZeroByte
Beiträge: 25
Registriert: Mi 14. Sep 2011, 21:08

Re: Soft Timeout C/C++ Netzwerk

Beitragvon ZeroByte » Sa 25. Feb 2012, 20:15

Interessant. Ich habe zwar noch nie danach gesucht, allerdings wäre es fatal, wenn Streams absolut garnicht kompatibel zu anderen Sprachen wären. Hast du da mal ein paar Links?

Ich bin einfach mal die Links durchgegangen, die man so unter "C++ Java Streams Problem" und "Boost Java Streams problem" findet. Es gibt da gleich mehrere Topics, die sich dem Thema widmen - die Ursachen, die da debattiert werden, sind allerdings sehr unterschiedlich. Konkrete Links habe ich jetzt nicht mehr - das sind ohnehin Spezialfälle (wo kommt es schon auf 0.5s an ^^ ) mit diffusen Ursachenbeschreibungen, da denen das Problem eben auch nicht 100% klar ist.

Um eine Nachricht auf jeden Fall abzusenden, sodass der Puffer geleert wird, gibt es eigentlich in jeder Sprache eine Socket-Bibliothek, die auch den Befehl flush() zur Verfügung stellt. Aber da ich nichts genaueres über dein Problem weiß, möchte ich hier nicht zu viel mutmaßen.

Das habe ich schon ausprobiert: einmal flush und einmal massenhaft Schreibzugriffe in Größenordnungen über der Puffergröße

Anbieten könnte ich dir außerdem, mal für einige Testspiele die Differenzen der gemessenen Zugzeit auf Client- und Serverseite anhand der Serverlogs zu bestimmen, falls dir das weiterhilft.

Schon geschehen - die gehen locker bis zu einer halben Sekunde rauf. Wie die sich im Laufe des Spieles entwickeln, habe ich jedoch noch nicht getestet.

Zur Überwachung des Netzwerktraffics unter Windows:
Wenn du einen Client im Server startest, wird sich dieser ja vermutlich auf localhost/127.0.0.1 verbinden? Nur eine Vermutung. Läuft der Traffic auch dann nicht über den regulären Stack, wenn du den Server und den Client getrennt startest und den Client auf deine tatsächlich IP-Adresse verbinden lässt? Ansonsten könntest du das doch mit einem zweiten (virtuellen/physikalischen) System im Netzwerk testen oder du sprichst dich mit einem Freund über Internet ab, der den Socha Server auf seinem PC laufen lässt und ihr protokolliert jeweils den Netzwerkverkehr auf beiden Seiten.

Mein heimisches Internet hat in eine Richtung eine Latenz von gut 200ms, zusammen also auch knapp eine halbe Sekunde :)
In der Schule kann ich das nicht ohne Weiteres ausprobieren, weil winPCap Administratorrechte benötigt.
Ich könnte zu einem Bekannten gehen und dann per Crossover eine Vermessung vornehmen. Damit hätte ich aber früher anfangen müssen, weil ich gerade jetzt Abitur mache :)


Mit freundlichen Grüßen,
zeroByte