Я пишу небольшое приложение, которое по сути меняет XML взад и вперед a-la SOAP. У меня есть сервер на базе OS X и клиент iPad. Я использую KissXML
на клиенте и встроенный анализатор XML на сервере. Я использую GCDAsyncSocket
на обоих для общения.iOS Packet Length
Когда я тестирую свое приложение на симуляторе iPad, вы получаете полный XML. Все работает нормально.
Однако, когда я использую свое устройство разработки (фактическое физическое iPad), все остальное работает нормально, но XML заканчивается после 1426-го символа. Я проверил, что эта ошибка возникает на нескольких iPad.
Когда я подписаться на входящие пакеты на GCDAsyncSocket
я использую [sock readDataWithTimeout:-1 buffer:[NSMutableData new] bufferOffset:0 maxLength:0 tag:0];
и ранее только простой [sock readDataWithTimeout:-1 tag:0];
но оба имеют один и тот же результат. Кажется, что GCDAsyncSocket ни в коем случае не виноват, так как исполнение на тренажере прекрасное. Обратите внимание, что 0
в maxLength
указывает «бесконечный» буфер.
Кто-нибудь знает, что может быть причиной этого?
Что-нибудь особенное в отношении персонажа 1426 или других предметов вокруг него? Кроме того, '[NSMutableData new]' скорее всего, будет утечка памяти, если не использует ARC. Рассмотрим '[NSMutableData data]'. – Joe
Данные варьируются от передачи до передачи, но всегда заканчиваются в одном и том же месте, а также без имитатора; таким образом, мой вывод о максимальной длине где-то. В качестве побочного примечания программы используют ARC. –
В зависимости от вашей точной настройки сети, [MTU] (http://en.wikipedia.org/wiki/Maximum_transmission_unit) часто бывает около 1400-1500. Сообщения длиннее, чем фрагментированные и отправляются отдельными пакетами. Когда вы работаете на симуляторе, с сервером на том же компьютере, вы не используете физическую сеть, поэтому эффективный MTU намного выше, и вы не получаете фрагментации. Вы уверены, что используете 'GCDAsyncSocket' правильно? Вероятно, вы будете называть 'readDataWithTimeout' несколько раз, а не один раз. –