2010-12-28 25 views
2

2つのアプリケーション、コンソールサーバーとウィンドウ付きクライアントからなる2Dマルチプレイヤーゲームを作成しています。これまでのところ、クライアントはFD_SETを持っていました。これは接続されたクライアント、私のゲームオブジェクトポインタのリスト、その他いくつかのもので満たされています。 main()では、ソケット上でリッスンを初期化し、着信接続を受け付けてFD_SET内に配置する3つのスレッドと、オブジェクトの位置、速度、および加速度を処理し、(必要に応じて)クライアント上で更新する必要があります。 3番目のスレッドはsend()関数を使用して、すべてのオブジェクトの更新情報を送信します(オブジェクトポインタのリストを反復します)。そのようなパケットは、操作コード、パケットサイズ&実際のデータから成ります。クライアントでは、正しく受信された最初の5バイト(オペコードとパケットサイズ)を読み取ることで解析しますが、パケットの残りの部分を読み取るときは(現在のサイズを知っているので)、 WSAECONNABORTED(エラーコード10053)。私はこのエラーについて読んだことがありますが、なぜ私のアプリケーションで発生するのかわかりません。どんな助けもありがとう。2回目にrecvを使用した場合のWSAECONNABORTED

答えて

0

エラーは、システムがソケットを閉じたことを意味します。これは、クライアントが切断されたことを検出したか、または読み取り中のデータよりも多くのデータを送信していたためです。

ネットワークプロトコル用のパーサーは、通常、堅牢にするために多くの作業が必要で、単一のread()などで取得するデータの量を知ることはできません。あなたが読んだ最初のチャンクであなたのオペレーションコードとパケットサイズ以上を得るかもしれません、あなたはより少なくても(例えばオペレーションコードだけ)得るかもしれません。あなたの失敗事例ではこれが起こっていないことを再度確認してください。

+0

私は最初のrecv()が私にちょうど5バイトを渡すことを確認しました。最初のrecv()は常に期待どおりに動作しますが、2番目のrecv()は常に10053エラーで失敗します。最初はサーバーが短時間で多くのパケットをポンピングしていましたが、recv()関数が失敗した理由ではないことを確認するために、10秒間に1パケットしか送信されないように変更しました。問題の原因となります。 –

関連する問題