0

私のアプリは、AsyncSocketを使用してTCP経由でサーバーと通信します。コミュニケーションが行われる状況は2つあります。

  1. アプリはサーバーに何かを送信し、サーバーは応答します。アプリはこの応答を読み取り、その中の情報を使用して何かを行う必要があります。この応答は常に同じ長さです。たとえば、応答は常に6バイトです。

  2. アプリは「アイドリング」状態であり、サーバーはある時点で通信を開始します(アプリには不明)。アプリは、サーバーが送信しているものをすべて読み取り(任意のバイト数にすることができますが、最初のバイトは後続のバイト数を示すため、読み取りを停止するタイミングがわかります)、この情報を処理する必要があります。

最初の状況は正常に機能しています。readDataToLength:timeout:tag必要なものを返し、それを使ってやりたいことができます。実装方法がわからないのは2番目の状況です。readDataToLength:timeout:tag事前に長さがわからないので使えません。

readDataWithTimeout:tag:タイムアウトを-1に設定して、何かできると思います。これにより、ソケットは入ってくるものを常にリッスンできるようになると思います。ただし、それはおそらく、私が送信したものへの応答として入ってくるデータに干渉します(状況1)。アプリは、受信データをシチュエーション1またはシチュエーション2と区別できなくなりました。

私にこれを解決するのを手伝ってくれる人はいますか?

4

1 に答える 1

1

エラーはネットワークプロトコルの設計にあります。

プロトコルにこの情報がない限り、応答とサーバーが開始する通信を区別する方法はありません。また、ネットワーク遅延により、説明した明らかな時間ベースのアプローチが確実に機能しなくなります。

ケースのプロトコルを修正する簡単な方法の1つ(サーバーが開始するメッセージが常に255バイト未満の場合)-応答の先頭に7番目のバイトを値FFで追加します。

このようにして、1バイトのDataWithTimeout:tag:を読み取ることができます。タイムアウト時に、データが得られるまで再試行します。受信した値がFFの場合、を使用してさらに6バイトを読み取りreadDataToLength:6 timeout: tag:、それを以前に送信した要求への応答として解釈します。それが他の値である場合は、でメッセージを読み取り、readDataToLength:theValue timeout: tag:サーバーが開始したメッセージを処理します。

于 2012-11-16T20:19:42.847 に答える