CocoaAsyncSocket y leyendo datos de un socket

En mi servidor basado en socket TCP, envío paquetes a través de la secuencia donde los paquetes consisten en un encabezado que especifica el número de bytes en el paquete, seguido de ese número de bytes. Para aquellos familiarizados con Erlang, simplemente estoy configurando la opción {paquete, 4}. En el lado de iOS, tengo un código que se ve así, suponiendo que quiero averiguar el tamaño de la transmisión para este mensaje:

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

Eso funciona bien y se invoca la siguiente devolución de llamada del método delegado:

onSocket:didReadData:withTag:

Creo que el siguiente paso lógico es calcular el tamaño de la transmisión, y lo hago con:

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

Después de codificar una cadena de 12 bytes en el lado del servidor, readLength también lee 12 en el cliente, por lo que todo está bien hasta ahora. Procedo con lo siguiente:

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

En este punto, aunque la devolución de llamadaonSocket:didReadData:withTag: ya no se invoca. En cambio, se están agotando los tiempos de espera de la lectura, probablemente porque no manejé la lectura correctamente, este método de delegado se invoca:

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

so en total, el servidor está enviando 16 bytes, un encabezado de 4 bytes y un flujo binario de 12 bytes.

Estoy seguro de que el error está en cómo estoy usando CocoaAsyncSocket. ¿Cuál es la forma correcta de leer el resto de la transmisión después de que calcule su tamaño?

** ACTUALIZACIÓN **

Cambié mi cliente y parece estar funcionando ahora. El problema es que no entiendo el punto de readDataToLength con la nueva solución. Esto es lo que cambié mi lectura inicial a:

[socket readDataWithTimeout:-1 tag:HEADER_TAG];

Ahora en mi devolución de llamada, solo hago lo siguiente:

- (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];
    }

}

Así que todo viene como una carga atómica. Quizás esto se deba a la forma en que funciona Erlang {paquete, 4}. Espero que lo sea. De lo contrario, ¿cuál es el punto de readDataToLength? no hay forma de saber la longitud de un mensaje por adelantado en el cliente, entonces, ¿cuál es un buen caso de uso para usar ese método?