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
2
A
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.
Verwandte Themen
- 1. Scanf wird nicht zum zweiten Mal ausgeführt
- 2. DatePicker über textField.inputView wird nur zum zweiten Mal angezeigt (normale Tastatur wird zum ersten Mal aufgerufen)
- 3. Probleme mit Android App zum zweiten Mal
- 4. Radio-Button-Ereignis wird nicht zum zweiten Mal gefeuert
- 5. Karte wird nicht zum zweiten Mal geladen. Ich klicke
- 6. Android Tastaturabdeckung EditText, wenn ich es zum zweiten Mal klicke
- 7. Warum funktioniert SIGALRM nicht zum zweiten Mal?
- 8. onResume() nicht zum zweiten Mal aufgerufen Eine Aktivität wird gestartet
- 9. CSS-Animation wird nicht zum zweiten Mal angewendet
- 10. Java: Serialisierung funktioniert nicht zum zweiten Mal
- 11. jQuery (window) .load() nicht zum zweiten Mal
- 12. Scanf wird nicht für die Eingabe fragen zum zweiten Mal
- 13. RxAndroid: Retrofit funktioniert nicht zum zweiten Mal?
- 14. Warum Init() -Methode wird nicht aufgerufen, wenn ich zum zweiten Mal zum ViewModel navigiere?
- 15. Jquery Grid funktioniert nicht, wenn es zum zweiten Mal geladen
- 16. On Change funktioniert nicht zum zweiten Mal
- 17. HttpUrlConnection.openConnection schlägt zum zweiten Mal fehl
- 18. Xamarin.form setpage funktioniert nicht zum zweiten Mal
- 19. Jedes Mal, wenn die Schaltfläche geklickt wird, wird MVVM verwendet.
- 20. Wenn diese Funktion zum zweiten Mal aufgerufen wird, erstellen die untergeordneten Divs erneut
- 21. So deaktivieren Sie das Jqueryui-Dialogfeld, wenn die Seite zum zweiten Mal geladen wird
- 22. MySQL aktualisiert die Ganzzahlspalte falsch, wenn sie zum zweiten Mal aktualisiert wird
- 23. Highcharts (PieChart) - Diagramm Breite reduziert beim Zeichnen zum zweiten Mal
- 24. Google Maps API - GDirections.getDuration() gibt null zum ersten Mal zurück, funktioniert zum zweiten Mal
- 25. UIMenuController Bearbeitungsmenü in UIWebView erscheint nur zum zweiten Mal
- 26. ViewPager in TabFragment lädt nicht zum zweiten Mal
- 27. Scanner wirft NoSuchElementException zum zweiten Mal von .nextInt();
- 28. Fragment zeigt nicht zum zweiten Mal, es ist
- 29. MKMapView Annotation ist nicht wählbar zum zweiten Mal
- 30. WFS-Filter kann nicht zum zweiten Mal eingestellt werden
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. –