AsyncSocket: объединение двух пакетов вместо двух отдельных - PullRequest
0 голосов
/ 20 февраля 2012

Я выполняю 4 команды запуска и также ожидаю получить 4 ответа.Сервер уже реализован, и другой разработчик, который разрабатывает Android, может получить эти 4 отдельных ответа, однако я получаю 2 хороших ответа (отдельно), а затем 3-й и 4-й ответы приходят как один ответ.Я поместил NSLog результата NSData в completeCurrentRead, и он выводит мне объединенный пакет "0106000000000b0600000000" вместо отдельных пакетов "010600000000" и "0b0600000000".Я также проверил эти 3-ю и 4-ю команды отдельно (только по одной за раз), и все в порядке с сервером, он отправляет их отдельно, однако происходит слияние (с 3-й и 4-й), если все четыре команды выполняются в строке,Есть идеи?

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

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

А в readIntoBuffer: maxLength есть вызов (длина == 256):

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

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

ОБНОВЛЕНИЕ2: я использую метод onSocket: didReadData: withTag: делегат и ожидаю получить данные ответа с тегомзапроса я выполнил.Недавно я понял, что потоки - это потоки, а не пакеты, но как я могу это решить?Ответы сервера не имеют завершающих символов в начале и конце ответа, только размер ответа, который составляет 2 - 5 байтов.Я могу вырезать первую часть ответа (первый пакет) и игнорировать вторую часть, но как AsyncSocket сделает еще один обратный вызов со второй частью ответа (второй пакет)?Если я обрежу только первые части и проигнорирую вторую, то ИМХО второй «пакет» будет потерян ...

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

UPDATE3: В onSocket: didReadData: withTag :, я вручную вырезал объединенный ответ, обработал первую часть (первый пакет) и затем в конце, вызвав вызов onSocket: didReadData: withTag: again:

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

Однако, похоже, что AsyncSocket сам связывает каждый пакет запроса с ответным пакетом (через класс AsyncReadPacket), используя теги.Итак, моя ручная обрезка работает, но AsyncSocket не знает, что я уже обработал оба пакета, и он все еще пытается прочитать второй пакет.Итак, я получаю обратный вызов sock: shouldTimeoutReadWithTag: ..., который вызывается, когда операция чтения достигла своего тайм-аута без завершения.

1 Ответ

0 голосов
/ 01 марта 2012

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

...