NSInputStream read: maxlength: возвращает больше байтов, чем maxlength

У меня есть приложение iOS, в котором я использую NSInputStream (на основе CFReadStreamRef) для чтения из сетевого сокета. Я продолжаю получать данные с сервера, продолжаю читать и обрабатывать их (используя read:bytesBuffer maxLength:l). Первые несколько раз он работает нормально, но примерно при 20-25-м чтении этот метод сообщает, что он прочитал ОГРОМНОЕ количество байтов, например. 4 294 967 295 байт, когда я действительно просил максимум, скажем, 1-3 МБ. Это странно и похоже на ошибку в NSInputStream/CFReadStream API.

Мое приложение в конечном итоге падает, поскольку оно пытается загрузить все эти байты в буфер, который не выделен для количества возвращаемых байтов (и сервер не возвращает столько байтов в первую очередь!)

Кто-нибудь сталкивался с этой проблемой раньше?

Спасибо!


person R.S    schedule 28.09.2012    source источник


Ответы (1)


Возвращаемое значение из read:maxLength: — это NSInteger, которое в случае ошибки будет отрицательным. Вы, вероятно, приводите его к беззнаковому целочисленному типу, который превращает отрицательные числа в огромные положительные числа.

person Sven    schedule 28.09.2012
comment
В частности, 32-битное число со знаком -1 = 32-битное число без знака 4 294 967 295. Это число (наряду с 255 и 65535) должен сразу же распознать каждый программист. (Вам не нужно запоминать все цифры, но когда вы видите целое где-то около 4,2 миллиарда, это должно насторожить.) - person abarnert; 28.09.2012
comment
Спасибо ребята! Это действительно было проблемой. - person R.S; 28.09.2012