2010-12-28 14 views
2

Ich schreibe ein 2D-Multiplayer-Spiel, bestehend aus zwei Anwendungen, einem Konsolenserver und einem gefensterten Client. Bisher hat der Client eine FD_SET, die mit verbundenen Clients gefüllt ist, eine Liste meiner Spielobjektzeiger und einige andere Dinge. In der main() initialisiere ich das Anhören eines Sockets und erstelle drei Threads, einen für das Akzeptieren eingehender Verbindungen und das Platzieren von ihnen innerhalb des FD_SET, einen weiteren für das Verarbeiten von Ort, Geschwindigkeit und Beschleunigung von Objekten und das Markieren dieser (falls erforderlich) die auf dem Client aktualisiert werden müssen. Der dritte Thread verwendet die Funktion send(), um Aktualisierungsinformationen für jedes Objekt zu senden (durch die Liste der Objektzeiger zu iterieren). Ein solches Paket besteht aus einem Operationscode, Paketgröße & den eigentlichen Daten. Auf dem Client parse ich es, indem ich die ersten 5 Bytes (den Opcode und die Paketgröße) lese, die korrekt empfangen werden, aber wenn ich den restlichen Teil des Pakets lesen will (da ich jetzt die Größe davon kenne), bekomme ich a WSAECONNABORTED (Fehlercode 10053). Ich habe über diesen Fehler gelesen, kann aber nicht erkennen, warum er in meiner Anwendung auftritt. Jede Hilfe wäre willkommen.WSAECONNABORTED wenn recv zum zweiten Mal verwendet wird

Antwort

0

Der Fehler bedeutet, dass das System den Socket geschlossen hat. Dies könnte daran liegen, dass der Client die Verbindung getrennt hat oder weil er mehr Daten gesendet hat als Sie gelesen haben.

Ein Parser für Netzwerkprotokolle benötigt typischerweise eine Menge Arbeit, um es robust zu machen, und Sie können nicht sagen, wie viele Daten Sie in einem einzigen read() erhalten, z. Sie können mehr als Ihren Operationscode und die Paketgröße in dem ersten Teil lesen, den Sie lesen, Sie könnten sogar weniger erhalten (z. B. nur den Operationscode). Überprüfen Sie, dass dies in Ihrem Fehlerfall nicht geschieht.

+0

Ich stellte sicher, dass die erste recv() mich genau 5 Bytes bekommt. Der erste recv() funktioniert immer wie erwartet, obwohl der zweite recv() immer mit einem Fehler 10053 fehlschlägt. Zuerst pumpte der Server viele Pakete in kurzen Abständen, aber um sicher zu gehen, dass die recv() Funktion nicht funktionierte, habe ich sie so geändert, dass nur ein Paket pro 10 Sekunden gesendet wurde, also nicht, was ist verursacht das Problem. –

Verwandte Themen