Asyncsocket:別々の2つのパケットの代わりに2つのパケットをマージする

StackOverflow https://stackoverflow.com/questions/9359391

質問

4つの起動コマンドを実行しており、4つの応答を受け取ることも期待しています。サーバーはすでに実装されており、Androidを開発している別の開発者はこれらの4つの個別の応答を受信することができますが、2つの良い応答(個別)を取得し、3番目と4番目の応答が1つの応答として届きます。 NSDATAのnslogを配置して、CompleteCurrentReadになり、個別のパケット「01060000000000」と「0B060000000000」の代わりに、パケット「0106000000000B0600000000」をマージしました。また、これらの3番目と4番目のコマンドを分離し(一度に1つだけ)テストしましたが、サーバーではすべてが問題ありません。それは個別に送信しますが、4つのコマンドすべてが並んで実行されるとマージ(3番目と4番目)が発生します。 。何か案は?

更新:私は問題のルーツにたどったと思います。 dobytesavableメソッドのストリームからのパケットデータを読み取るコールがあります。

CFIndex result = [self readIntoBuffer:subBuffer maxLength:bytesToRead];

readintobuffer:maxlengthには、呼び出しがあります(長さ== 256):

return CFReadStreamRead(theReadStream, (UInt8 *)buffer, length);

したがって、CFReadStreamReadはパケットの誤った長さを返します-12の長さ(6の代わりに)を返し、データを統合しました。 HM、CFREADSTREAMREADが個別に読み取る代わりに、2つのパケットを1つに読み取る原因となる可能性があります...

update2:onsocket:didreaddata:withtag:delegateメソッドを使用しており、実行したリクエストのタグを使用して応答データを受信することを期待しています。最近、ストリームはパケットではなくストリームであることがわかりましたが、どうすればそれを解決できますか?サーバーの応答には、応答の開始時と終了時に終端charがありません。これは、2〜5バイトとして提供されます。応答の最初の部分(最初のパケット)をカットして2番目の部分を無視できますが、Asyncsocketが応答の2番目の部分(2番目のパケット)で別のコールバックをどのように行うか?最初の部分のみをカットして2番目の部分を無視すると、2番目の「パケット」が失われます...

応答の最初の部分をカットし、AsyncsocketにTAGで別のコールバックを作成し、応答の2番目の部分を個別のコールバックとして伝える方法は?

update3:insocket:didreaddata:withtag:、マージのマージをカットし、最初の部分(最初のパケット)を処理してから最後に、onsocketへの呼び出しを投げます:didreaddata:withtag:繰り返します:

if (isMergedPacket) {
  ...
 [self onSocket:sock didReadData:restPartOfTheResponse withTag:myCommandTag];
}

ただし、タグを使用して(AsyncreadPacketクラスを介して)応答パケットとすべてのリクエストパケットをペアでペアするように見えます。したがって、私の手動の切断は機能しますが、Asyncsocketは私がすでに両方のパケットを処理していることを知りませんが、それでも2番目のパケットを読み込もうとしています。だから、私は靴下を取得しています:shuldtimeoutreadwithtag:...コールバックは、読み取り操作が完了せずにタイムアウトに達したときに呼び出されます。

役に立ちましたか?

解決

解決策が見つかりました。変更を加えて掘り下げる必要はありません。各応答の長さを定義する必要があります。コールバックを読んで取得することに興味があるバイトの量です。他の投稿でできる詳細情報 ここ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top