CocoaAsyncSocket e lendo dados de um soquete

No servidor baseado em soquete TCP, envio pacotes pelo fluxo em que os pacotes consistem em um cabeçalho que especifica o número de bytes no pacote, seguido por esse número de bytes. Para aqueles familiarizados com Erlang, estou simplesmente configurando a opção {packet, 4}. No lado do iOS, eu tenho um código parecido com este, supondo que eu queira descobrir o tamanho do fluxo para esta mensagem:

[asyncSocket readDataToLength:4 withTimeout:-1 tag:HEADER_TAG];

Isso funciona bem e o seguinte retorno de chamada do método delegado é chamado:

onSocket:didReadData:withTag:

Eu imagino que o próximo passo lógico é descobrir o tamanho do fluxo e faço isso com:

  UInt32 readLength;
  [data getBytes:&readLength length:4];
  readLength = ntohl(readLength);

Depois de codificar uma string de 12 bytes no lado do servidor, o readLength também lê 12 no cliente, então tudo fica bom até agora. Prossigo com o seguinte:

 [sock readDataToLength:readLength withTimeout:1 tag:MESSAGE_TAG];

Neste ponto, porém, o retorno de chamadaonSocket:didReadData:withTag: não é mais invocado. Em vez disso, estão ocorrendo tempos limites na leitura, provavelmente porque eu não lidei com a leitura corretamente, esse método delegado é chamado:

- (NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length 

o total, o servidor está enviando 16 bytes, um cabeçalho de 4 bytes e um fluxo binário de 12 byte

Estou confiante de que o erro está em como estou usando o CocoaAsyncSocket. Qual é o caminho certo para ler o restante do fluxo depois de descobrir o tamanho?

** UPDATE **

Troquei meu cliente e parece estar funcionando agora. O problema é que não entendo o ponto de readDataToLength com a nova solução. Aqui está o que eu mudei minha leitura inicial para:

[socket readDataWithTimeout:-1 tag:HEADER_TAG];

gora, no meu retorno de chamada, faço o seguinte:

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
    if (tag == HEADER_TAG) {
        UInt32 readLength;
        [data getBytes:&readLength length:4];
        readLength = ntohl(readLength);
        int offset = 4;
        NSRange range = NSMakeRange(offset, readLength);
        char buffer[readLength];
        [data getBytes:&buffer range:range];
        NSLog(@"buffer %s", buffer);
        //[sock readDataToLength:readLength withTimeout:1 tag:MESSAGE_TAG];
    } else if (tag == MESSAGE_TAG) {
        //[sock readDataToLength:4 withTimeout:1 tag:HEADER_TAG];
    }

}

Então tudo está entrando como uma carga útil atômica. Talvez seja por causa da maneira como Erlang {pacote, 4} funciona. Espero que seja. Caso contrário, qual é o objetivo de readDataToLength? não há como saber antecipadamente o tamanho de uma mensagem no cliente; portanto, qual é um bom caso de uso para usar esse método?

questionAnswers(1)

yourAnswerToTheQuestion