2012-02-20 6 views
0

私は4つの起動コマンドを実行しており、4つの応答を受け取ることを期待しています。サーバーは既に実装されていて、アンドロイドを開発している別の開発者は、別々の4つの応答を受け取ることができますが、私は2つの良い応答(別々)を得ています。私はNSDataのNSLogをcompleteCurrentReadに設定し、別のパケット "010600000000"と "0b0600000000"の代わりにマージされたパケット "0106000000000b0600000000"を出力します。また、3回目と4回目のコマンドを別々にテストしました(一度に1つだけです)。サーバではすべてOKですが、別々に送信しますが、4つのコマンドがすべて1行で実行されるとマージ(3回目と4回目) 。何か案は?AsyncSocket:別々の2つのパケットの代わりに2つのパケットをマージする

更新:私は問題のルーツに辿り着いたと思います。 doBytesAvailable方法でストリームからのパケットデータを読み込むコールがあります:

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

そしてreadIntoBufferに:maxLengthのは、コール(長さ== 256)があります:

だから、
return CFReadStreamRead(theReadStream, (UInt8 *)buffer, length); 

、CFReadStreamReadは間違った長さを返します。パケットの長さは12(6ではなく)の長さを返し、併合されたデータも取得します。 CFReadStreamReadが2つのパケットを別々に読み取るのではなく、2つのパケットを1つに読み込む可能性があります...

UPDATE2:onSocketを使用しています:didReadData:withTag:リクエストのタグで応答データを受信する予定です。私は演奏した。私は最近、ストリームはストリームであり、パケットではなく、どのように解決できるかを認識しましたか?サーバーの応答には、応答の開始と終了時に終了文字がありません。応答サイズは2〜5バイトです。私は応答(最初のパケット)の最初の部分をカットし、2番目の部分は無視することができますが、AsyncSocketは応答(2番目のパケット)の2番目の部分と別のコールバックを作りますか?私が最初の部分だけを切り捨て、2番目のIMHOを無視すると、2番目の "パケット"が失われます。

応答の最初の部分を切り取り、タグともう1つのコールバックを行うようにAsyncSocketに指示する方法別のコールバックとしての応答?

Update3と:onSocketにおいて:didReadData:withTag :,私は手動で、マージされた応答を切断最初の部分(最初のパケット)を処理した後、終了時に、onSocketにコールを投げる:didReadData:withTag:再び:

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

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

答えて

0

検出された溶液。 AsyncSocketを変更して掘り下げる必要はありません。各応答の長さを定義するだけで、読み込みとコールバックの取得にどれだけのバイトが必要ですか。他の投稿にもっと詳しい情報を投稿here

関連する問題