Asyncsocket: Получение объединения двух пакетов вместо отдельных двух пакетов

StackOverflow https://stackoverflow.com/questions/9359391

Вопрос

Я выполняю 4 команды запуска, а также ожидаю получить 4 ответа. Сервер уже реализован, и еще один разработчик, который разрабатывает Android, способен получать эти 4 отдельных ответа, однако я получаю 2 хороших ответа (отдельные), а затем 3 -й и 4 -й ответы в качестве одного ответа. Я поместил NSLOG NSDATA привести к завершению, и он выводит мне объединенный пакет "0106000000000B0600000000" вместо отдельных пакетов "010600000000" и "0B060000000000". Я также проверил эти 3 -й и 4 -й команды по отдельности (только по одному за раз), и все в порядке с сервером, он отправляет их отдельно, однако происходит слияние (с 3 -м и 4 -м), если все четыре команды выполняются в линии Анкет Любые идеи?

ОБНОВЛЕНИЕ: Я думаю, что я проследил до проблем с проблемами. Есть звонок, который считывает данные пакетов из потока в методе Dobytesavailable:

CFIndex result = [self readIntoBuffer:subBuffer maxLength:bytesToRead];

И в redhintobuffer: maxlength, есть звонок (длина == 256):

return CFReadStreamRead(theReadStream, (UInt8 *)buffer, length);

Таким образом, CFReadStreamRead возвращает неверную длину пакета - он возвращает длину 12 (вместо 6), а также получает объединенные данные. HM, что может привести к тому, что CFReadStreamRead читает два пакета в один, вместо того, чтобы читать их отдельно ...

Update2: я использую Onsocket: DidReadData: WithTag: Delegate Method и ожидаю получить данные ответа с помощью тега запроса, который я выполнил. Недавно я понял, что потоки - это потоки, не пакеты, а как я могу решить это? Ответы на сервере не имеют прекращения ChARS в начале и окончании ответа, только размер ответа, который составляет 2 - 5 байтов. Я могу сократить первую часть ответа (первый пакет) и проигнорировать вторую часть, но как асинксакет сделает еще один обратный вызов со второй частью ответа (второй пакет)? Если я вырезаю только первые части и проигнорирую вторую, то IMHO будет потерян второй «пакет» ...

Как сократить первую часть ответа и сказать Asyncsocket, чтобы сделать еще один обратный вызов с тегом и второй части ответа в качестве отдельного обратного вызова?

Update3: В Onsocket: DidReadData: WithTag:, я вручную вырезал объединенный ответ, обрабатываю первую часть (первый пакет), а затем в конце бросал вызов Onsocket: DidReadData: WithTag: Опять: снова:

if (isMergedPacket) {
  ...
 [self onSocket:sock didReadData:restPartOfTheResponse withTag:myCommandTag];
}

Тем не менее, он выглядит как сами асинксакет сочетает каждый пакет запросов с пакетом ответов (через класс Asyncreadpacket) с использованием тегов. Итак, моя ручная резка работает, но Asyncocket не знает, что я уже обрабатывал оба пакета, и он все еще пытается прочитать второй пакет. Итак, я получаю ноз: должен время, когда вы можете получить время, не завершается.

Это было полезно?

Решение

Найдено решение. Нет необходимости меняться и копаться в асинксокете. Вам просто нужно определить продолжительность каждого ответа - сколько байтов вы заинтересованы в чтении и получении обратного вызова. Больше информации вы можете на другом сообщении здесь

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top