私は、Python Twisted バックエンドとやり取りする iPhone アプリケーション用のネットワーク コードに取り組んでいます。最近、私の NSOutputStream が送信時にペイロードを 2 倍にしている、またはツイストが受信時にペイロードを 2 倍にしているような問題に遭遇しました。
「アップル推奨」スタイルの TCP ソケット、EG 非ポーリングを使用しています。
プロセスは次のとおりです。
CLIENT
- NSStreamEventHasSpaceAvailable: X バイトのデータのパケットを送信します
- NSStreamEventHasSpaceAvailable: Y バイトのデータの別のパケットを送信します
SERVER
- Twisted はサイズ (X + Y) バイトのパケットを受信します
outputStream のステータスが「NSStreamStatusWriting」の場合、明示的にデータを送信しないようにしています。また、NSStreamEventHasSpaceAvailable がスローされていない場合、クライアントからのデータの送信が許可されないようにします。
このペイロードの二重化/合併の原因について何か考えはありますか? Twisted のコードはかなり単純で、プロトコルで標準の dataReceived を使用しています。
def dataReceived(自己、データ): # データの処理方法を決定するためにロジックを実行する # ... # ここに len(data) を出力すると、マージされたパケット サイズが明らかになります
iOS コードもかなり標準的です。
if (eventCode == NSStreamEventHasSpaceAvailable) { [outputStream 書き込み:[パケット getData] maxLength:[パケット getPacketSize]]; } // [packet getData] は単に標準の UInt8 配列を返します。 // [packet getPacketSize] はその配列のサイズを返します。
上記の iOS コードが連続して 2 回呼び出されると (たとえば、2 つのパケットを次々に送信する)、ツイスト コードはマージされたデータ サイズを報告します。
アドバイスや提案をお寄せいただきありがとうございます。