Telnet a través de un socket con GCDAsyncSocket

Estoy tratando de conectarme a un códec Cisco C40 a través de telnet desde el objetivo c. Al usar el terminal en mi computadora obtengo:

Contraseña:

Sin embargo, al realizar una conexión de socket, hay negociaciones de telnet que deben realizarse. Lo cual soy, pero por alguna razón no puedo acceder al mensaje "Contraseña:" arriba.

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSLog(@"RECEIVE BUFFER %@",data);

    //store read bytes to rawData
    self.rawData = [[NSMutableData alloc] initWithData:data];

    //cast bytes
    const uint8_t *bytes = [self.rawData bytes];

    //go through rawdata format and save it to networkbuffer
    for (int i =0; i < [self.rawData length]; i++)
    {
        if (![[NSString stringWithFormat:@"%02X", bytes[i]]isEqual:@"0D"])
        {
            [self.networkBuffer addObject:[NSString stringWithFormat:@"%02X", bytes[i]]];
        }
    }

    //negotiate any telnet protocal stuff (just accept options )
    //example:
    //FF:FD:18 returns FF:FB:18
    while([[self.networkBuffer objectAtIndex:0]isEqualToString:@"FF"] && [[self.networkBuffer objectAtIndex:1]isEqualToString:@"FD"] ) {
//        NSLog(@"HERE");

        NSData * tempData =[data subdataWithRange:NSMakeRange(0, 3)];

        NSMutableData * tempMutData = [NSMutableData dataWithData:tempData];

        const unsigned char replacement[] = {
                0xFC
            };

        [tempMutData replaceBytesInRange:NSMakeRange(1, 1) withBytes:replacement];

        [self sendCommand:tempMutData];

        data = [data subdataWithRange:NSMakeRange(3, [data length]-3)];

        self.networkBuffer = [NSMutableArray arrayWithArray:[self.networkBuffer subarrayWithRange:NSMakeRange(3, [self.networkBuffer count]-3)]];

//        NSLog(@"network buffer after removal: %@", data);

        if ([self.networkBuffer count]<3) {
            [self.networkBuffer insertObject:@" " atIndex:0];
        }
    }

    //decode from bytes to text
    for ( NSString * component in self.networkBuffer)
    {
        int value = 0;
        sscanf([component cStringUsingEncoding:NSASCIIStringEncoding], "%x", &value);
        [self.dataString appendFormat:@"%c", (char)value];
        NSLog(@"data byte: %c",(char)value);
    }
    [self telnetResponse:self.dataString];

    [self.networkBuffer removeAllObjects];
    [self.socket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0];//CRLFData
}

Aquí hay un desglose de las opciones de negociación de telnet que estoy recibiendo y enviando:

servidor enviándome

FF, FD, 18 (0x18 = 24dec) (Tipo de terminal)

FF, FD, 20 (0x20 = 32dec) (Do velocidad terminal)

FF, FD, 23 (0x23 = 35dec) (Do X Mostrar ubicación)

FF, FD, 27 (0x27 = 39dec) (Opción de Nuevo Entorno)

Mi intento de una respuesta que no funciona (no se solicita una entrada adicional):

FF, FC, 18 (0x18 = 24dec) (Tipo de terminal no)

FF, FC, 20 (0x20 = 32dec) (Sin velocidad de terminal)

FF, FC, 23 (0x23 = 35dec) (No se mostrará la ubicación de X)

FF, FC, 27 (0x27 = 39dec) (No se incluirá la opción de entorno)

Si observa el código, verá que estoy comprobando la FF y, en caso afirmativo, respondiendo con bytes similares (reemplazando FD con FC), con la esperanza de que no acepte las opciones pero que no parezca funcionar.

Enlaces que me ayudaron:

https://stackoverflow.com/a/2913991/530933

Comandos Telnet IAC (NSStream socket)

http://www.iprodeveloper.com/forums/aft/52910

ACTUALIZAR

Hice un wirehark con un shell de comando y el códec de cisco. Después de lo cual duplicé la configuración de negociación / paquetes. Ahora el único problema es que solo estoy obteniendo el eco. Así que no obtendré nada, enviaré un comando y luego volveré a recibir un mensaje más mi texto. (Ejemplo: no obtener nada: enviar el nombre de usuario "admin" - volver a "login: admin") Por lo tanto, me refiero a solo obtener el eco. Debería obtener un mensaje de "inicio de sesión:" y luego enviar "admin", luego debería solicitarme la contraseña.

Aquí están las opciones de negociación que estoy enviando al conectar:

//will terminal type
    //will negotiate about window size
    const unsigned char nineteen[] = {
        0xFF, 0xFB, 0x18, 0xFF, 0xFB, 0x1F
    };
    self.dataToBeSent = [[NSData alloc]initWithBytes:nineteen length:sizeof(nineteen)];
    [self sendCommand:self.dataToBeSent];

    //wont terminal speed
    //wont X display location
    //will new environment option
    const unsigned char twenty[] = {
        0xFF, 0xFC, 0x20, 0xFF, 0xFC, 0x23, 0xFF, 0xFB, 0x27
    };
    self.dataToBeSent = [[NSData alloc]initWithBytes:twenty length:sizeof(twenty)];
    [self sendCommand:self.dataToBeSent];

    //Suboption being: negotiate about window size
    //end
    const unsigned char twentyOne[] = {
        //0xFF,0xFC, 0x18
        0xFF, 0xFA, 0x1F, 0x00, 0x50, 0x00, 0x19, 0xFF, 0xF0
    };
    self.dataToBeSent = [[NSData alloc]initWithBytes:twentyOne length:sizeof(twentyOne)];
    [self sendCommand:self.dataToBeSent];

    //new enviroment option
    //end
    const unsigned char twentyThree[] = {
        0xFF,0xFA, 0x27, 0x00, 0xFF, 0xF0
    };
    self.dataToBeSent = [[NSData alloc]initWithBytes:twentyThree length:sizeof(twentyThree)];
    [self sendCommand:self.dataToBeSent];

    //Terminal Type (ANSI)
    //end
    const unsigned char twentySeven[] = {
        0xFF,0xFA, 0x18, 0x00, 0x41, 0x4E, 0x53, 0x49, 0xFF, 0xF0
    };
    self.dataToBeSent = [[NSData alloc]initWithBytes:twentySeven length:sizeof(twentySeven)];
    [self sendCommand:self.dataToBeSent];

    //do suppress go ahead
    const unsigned char twentyEight[] = {
        0xFF, 0xFD, 0x03
    };
    self.dataToBeSent = [[NSData alloc]initWithBytes:twentyEight length:sizeof(twentyEight)];
    [self sendCommand:self.dataToBeSent];

    //will echo
    //dont status
    //wont remote flow control
    const unsigned char twentyFour[] = {
        0xFF, 0xFB, 0x01, 0xFF, 0xFE, 0x05, 0xFF,0xFC, 0x21
    };
    self.dataToBeSent = [[NSData alloc]initWithBytes:twentyFour length:sizeof(twentyFour)];
    [self sendCommand:self.dataToBeSent];

    //wont echo
    const unsigned char twentyFive[] = {
        0xFF, 0xFC, 0x01
    };
    self.dataToBeSent = [[NSData alloc]initWithBytes:twentyFive length:sizeof(twentyFive)];
    [self sendCommand:self.dataToBeSent];

    //Do echo
    const unsigned char twentySix[] = {
        0xFF,0xFD, 0x01
    };
    self.dataToBeSent = [[NSData alloc]initWithBytes:twentySix length:sizeof(twentySix)];
    [self sendCommand:self.dataToBeSent];

Respuestas a la pregunta(1)

Su respuesta a la pregunta