Telnet über einen Socket mit GCDAsyncSocket

Ich versuche, eine Verbindung zu einem Cisco C40-Codec über Telnet von Ziel c aus herzustellen. Wenn ich das Terminal auf meinem Computer benutze, erhalte ich:

Passwort:

Bei einer Socket-Verbindung müssen jedoch Telnet-Verhandlungen geführt werden. Was ich bin, aber aus irgendeinem Grund kann ich nicht an die Eingabeaufforderung "Passwort:" oben gelangen.

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

Hier ist eine Aufschlüsselung der Telnet-Verhandlungsoptionen beim Empfangen und Senden:

Server sendet mir:

FF, FD, 18 (0x18 = 24dec) (Do-Terminaltyp)

FF, FD, 20 (0x20 = 32dec) (Terminalgeschwindigkeit)

FF, FD, 23 (0x23 = 35dez) (X-Anzeigeposition ausführen)

FF, FD, 27 (0x27 = 39dez) (Neue Umgebungsoption ausführen)

Mein Versuch einer Antwort, die nicht funktioniert (keine Eingabeaufforderung für weitere Eingaben):

FF, FC, 18 (0x18 = 24dec) (Kein Terminaltyp)

FF, FC, 20 (0x20 = 32dec) (Keine Terminalgeschwindigkeit)

FF, FC, 23 (0x23 = 35dec) (nicht X Anzeigestandort)

FF, FC, 27 (0x27 = 39dez) (keine neue Umgebungsoption)

Wenn Sie sich den Code ansehen, werden Sie feststellen, dass ich nach FF suche und mit ähnlichen Bytes antworte (wobei FD durch FC ersetzt wird), in der Hoffnung, dass die Optionen nicht akzeptiert werden, dies jedoch nicht funktioniert.

Links, die mir geholfen haben:

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

Telnet-IAC-Befehle (NSStream-Socket)

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

AKTUALISIEREN

Ich habe einen Wireshark mit einer Befehls-Shell und dem Cisco-Codec gemacht. Danach habe ich diese Verhandlungseinstellungen / Pakete dupliziert. Jetzt ist das einzige Problem, dass ich nur das Echo bekomme. Also bekomme ich nichts, sende einen Befehl und bekomme dann eine Eingabeaufforderung und meinen Text zurück. (Beispiel: nichts bekommen - Benutzername "admin" senden - "login: admin" zurückbekommen) Also, was ich damit meine, nur das Echo zu bekommen. Ich sollte eine Eingabeaufforderung "login:" erhalten und dann "admin" senden. Dann sollte ich zur Eingabe des Passworts aufgefordert werden.

Hier sind die Verhandlungsoptionen, die ich beim Verbinden sende:

//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];

Antworten auf die Frage(1)

Ihre Antwort auf die Frage