2つのアプリケーション、コンソールサーバーとウィンドウ付きクライアントからなる2Dマルチプレイヤーゲームを作成しています。これまでのところ、クライアントはFD_SETを持っていました。これは接続されたクライアント、私のゲームオブジェクトポインタのリスト、その他いくつかのもので満たされています。 main()では、ソケット上でリッスンを初期化し、着信接続を受け付けてFD_SET内に配置する3つのスレッドと、オブジェクトの位置、速度、および加速度を処理し、(必要に応じて)クライアント上で更新する必要があります。 3番目のスレッドはsend()関数を使用して、すべてのオブジェクトの更新情報を送信します(オブジェクトポインタのリストを反復します)。そのようなパケットは、操作コード、パケットサイズ&実際のデータから成ります。クライアントでは、正しく受信された最初の5バイト(オペコードとパケットサイズ)を読み取ることで解析しますが、パケットの残りの部分を読み取るときは(現在のサイズを知っているので)、 WSAECONNABORTED(エラーコード10053)。私はこのエラーについて読んだことがありますが、なぜ私のアプリケーションで発生するのかわかりません。どんな助けもありがとう。2回目にrecvを使用した場合のWSAECONNABORTED
2
A
答えて
0
エラーは、システムがソケットを閉じたことを意味します。これは、クライアントが切断されたことを検出したか、または読み取り中のデータよりも多くのデータを送信していたためです。
ネットワークプロトコル用のパーサーは、通常、堅牢にするために多くの作業が必要で、単一のread()などで取得するデータの量を知ることはできません。あなたが読んだ最初のチャンクであなたのオペレーションコードとパケットサイズ以上を得るかもしれません、あなたはより少なくても(例えばオペレーションコードだけ)得るかもしれません。あなたの失敗事例ではこれが起こっていないことを再度確認してください。
関連する問題
- 1. ハイブ:1列が2回使用された場合
- 2. ReentrantlockでlockInterruptiblyを使用した場合のIllegalMonitorStateExceptionの回避
- 3. jquery.address:$ .address.queryStringを使用した場合$ .address.change()$ .address.queryStringを(使用する場合に二回実行されます)
- 4. 2回目の使用時にJavaスキャナが動作しない
- 5. 2つのJOINSを使用して2回使用する場合の列の選択方法は?
- 6. MSG_PEEKの非ブロックrecvが成功した場合、MSG_PEEKのない次のrecvも成功しますか?
- 7. 2番目の呼び出しからのrecv()ブロック
- 8. 2回送信し、recvが動作していませんC
- 9. 角度2のmd入力を使用した場合のダブルライン
- 10. php親ページは、ヘッダーの場所を使用した後に2回リダイレクト
- 11. データベース:データベースにmysqlをまだ使用している場合、Mysql.comは今年2回ハッキングされましたか?
- 12. 2回目の使用時にjQuery.formプラグインの問題
- 13. 目的Cコンベンション:使用する場合と使用する場合
- 14. 同じ関数を2回目に使用する
- 15. -fs-keep-with-inline:keepを使用した場合の2番目のページへのカラム値のレンダリング
- 16. /%category%/%postname%を使用した場合のWordpress 404ページ、/%postname%を使用した場合に動作します
- 17. aspnet_membershipを使用した場合のリスク
- 18. jqueryを使用した文の場合
- 19. "class.getResource("/")"を使用した場合のNullPointerException
- 20. VLookupを使用した文の場合
- 21. ハードライトブレンドモードを使用した場合のハイライトアーティファクト
- 22. tF.slim.evaluation.evaluate_onceを使用した場合のNotFoundError
- 23. substring()を使用した場合のNumberFormatException
- 24. combineByKey()を使用した場合のエラー
- 25. && ||を使用したロジックの場合
- 26. getExternalStoragePublicDirectoryを使用した場合のFileNotFoundException
- 27. TextWatcherを使用した場合のNullPointerError
- 28. ピカソを使用した場合のjava.lang.NoSuchMethodError
- 29. Directory.GetFilesを使用した場合のUnauthorizedAccessException
- 30. javax.cryptoを使用した場合のClassCastException
私は最初のrecv()が私にちょうど5バイトを渡すことを確認しました。最初のrecv()は常に期待どおりに動作しますが、2番目のrecv()は常に10053エラーで失敗します。最初はサーバーが短時間で多くのパケットをポンピングしていましたが、recv()関数が失敗した理由ではないことを確認するために、10秒間に1パケットしか送信されないように変更しました。問題の原因となります。 –