2つのアプリケーション、コンソールサーバーとウィンドウ付きクライアントからなる2Dマルチプレイヤーゲームを作成しています。これまでのところ、クライアントはFD_SETを持っていました。これは接続されたクライアント、私のゲームオブジェクトポインタのリスト、その他いくつかのもので満たされています。 main()では、ソケット上でリッスンを初期化し、着信接続を受け付けてFD_SET内に配置する3つのスレッドと、オブジェクトの位置、速度、および加速度を処理し、(必要に応じて)クライアント上で更新する必要があります。 3番目のスレッドはsend()関数を使用して、すべてのオブジェクトの更新情報を送信します(オブジェクトポインタのリストを反復します)。そのようなパケットは、操作コード、パケットサイズ&実際のデータから成ります。クライアントでは、正しく受信された最初の5バイト(オペコードとパケットサイズ)を読み取ることで解析しますが、パケットの残りの部分を読み取るときは(現在のサイズを知っているので)、 WSAECONNABORTED(エラーコード10053)。私はこのエラーについて読んだことがありますが、なぜ私のアプリケーションで発生するのかわかりません。どんな助けもありがとう。2回目にrecvを使用した場合のWSAECONNABORTED
2
A
答えて
0
エラーは、システムがソケットを閉じたことを意味します。これは、クライアントが切断されたことを検出したか、または読み取り中のデータよりも多くのデータを送信していたためです。
ネットワークプロトコル用のパーサーは、通常、堅牢にするために多くの作業が必要で、単一のread()などで取得するデータの量を知ることはできません。あなたが読んだ最初のチャンクであなたのオペレーションコードとパケットサイズ以上を得るかもしれません、あなたはより少なくても(例えばオペレーションコードだけ)得るかもしれません。あなたの失敗事例ではこれが起こっていないことを再度確認してください。
関連する問題
- 1. ReentrantlockでlockInterruptiblyを使用した場合のIllegalMonitorStateExceptionの回避
- 2. jquery.address:$ .address.queryStringを使用した場合$ .address.change()$ .address.queryStringを(使用する場合に二回実行されます)
- 3. 2番目の呼び出しからのrecv()ブロック
- 4. MSG_PEEKの非ブロックrecvが成功した場合、MSG_PEEKのない次のrecvも成功しますか?
- 5. データベース:データベースにmysqlをまだ使用している場合、Mysql.comは今年2回ハッキングされましたか?
- 6. 2回目の使用時にjQuery.formプラグインの問題
- 7. 同じ関数を2回目に使用する
- 8. 目的Cコンベンション:使用する場合と使用する場合
- 9. -fs-keep-with-inline:keepを使用した場合の2番目のページへのカラム値のレンダリング
- 10. afficheを使用した場合のエラー
- 11. VLookupを使用した文の場合
- 12. ピカソを使用した場合のjava.lang.NoSuchMethodError
- 13. aspnet_membershipを使用した場合のリスク
- 14. jqueryを使用した文の場合
- 15. ハードライトブレンドモードを使用した場合のハイライトアーティファクト
- 16. Directory.GetFilesを使用した場合のUnauthorizedAccessException
- 17. 角度回避のコードの重複 `NG-if`を使用した場合
- 18. GridPane getRowIndexは2回目の使用後にnullを返します
- 19. 2回目にクリックした要素を隠す方法
- 20. 2回目のソケットセレクト()ブロック
- 21. 2回目のクリックで、 jQuery
- 22. 私はProviderSigninControllerを使用した場合
- 23. 2つのクエリが互いに依存し、2つ目のクエリが失敗した場合のエラーの処理?
- 24. 化合物pkを使用した場合の化合物pk
- 25. メニューを2回目クリックしたときのページを非表示
- 26. 第1回で作成したプロパティファイルが2回目に空白になる
- 27. Devits認証Gemを使用した場合の引数の数(2の3)
- 28. jquery removeClassが2回目または3回目のクリック後にCSSを取得していません。
- 29. Doctrine 2の使用注釈リーダーをカスタマイズした注釈の場合
- 30. 2つのスレッドでNSPrivateQueueConcurrencyType管理対象オブジェクトコンテキストを使用した場合のデッドロック
私は最初のrecv()が私にちょうど5バイトを渡すことを確認しました。最初のrecv()は常に期待どおりに動作しますが、2番目のrecv()は常に10053エラーで失敗します。最初はサーバーが短時間で多くのパケットをポンピングしていましたが、recv()関数が失敗した理由ではないことを確認するために、10秒間に1パケットしか送信されないように変更しました。問題の原因となります。 –