0

NSInputStream の使用時に問題が発生しました。サーバーに接続するクライアントアプリがあり、サーバーはTCPを介してクライアントアプリにメッセージを1秒あたり約1メッセージ繰り返し送信し始めます。サーバーはクライアントにメッセージをブロードキャストしているだけで、メッセージは xml 形式です。サーバーはメッセージを 1 つのパケットとして送信します。

ここでの問題は、NSInputStream からバイトを読み取ると、データが切り捨てられたことです。これは、1 つの完全なメッセージを受信する代わりに、時々 2 つの個別のデータ (部分的な xml) の応答を得たことを意味します。NSInputStream からデータ バイトを読み取ったときに既に発生しているため、デバッグできません。

Wireshark を使用して受信したすべてのパケットを分析しますが、TCP が部分的なデータをクライアントに再送信するため、データも切り捨てられます。すべての部分データ バイトをログに記録しようとしましたが、部分データの合計は常に約 1600 バイトです。

彼らがどのようにサーバー側を設計および実装したかはわかりませんが、多くの人がそのサーバーに接続し、そこからブロードキャストメッセージを継続的に取得していることは知っています.

誰でもこの問題に遭遇しますか? 誰でも助けることができますか?データが最大サイズを超えて分割される可能性はありますか?

4

1 に答える 1

1

これ自体は問題ではありません。これは、TCP および の設計の一部ですNSInputStream。部分的なメッセージを受け取る場合があります。その事実に対処し、完全なメッセージを受信するまで待ってから、完成したメッセージを処理するのはあなたの仕事です。

1600 バイトは少し奇妙です。これは最大の正当なイーサネット パケットであるため、1500 バイトが予想されます (または、特に 1472 前後の、非常に一般的な MTU からヘッダーの一部を引いたものです)。または、バッファリングのために 1k または 4k の倍数を期待するかもしれませんNSInputStream。しかし、それは重要ではありません。必ずしも境界でメッセージを受け取るとは限らないという事実に対処する必要があります。

于 2013-01-10T01:27:19.983 に答える