Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 通过带有GCDAsyncSocket的套接字进行Telnet_Objective C_Telnet - Fatal编程技术网

Objective c 通过带有GCDAsyncSocket的套接字进行Telnet

Objective c 通过带有GCDAsyncSocket的套接字进行Telnet,objective-c,telnet,Objective C,Telnet,我正试图通过telnet从objective c连接到Cisco C40编解码器。使用计算机上的终端时,我得到: 密码: 但是,在进行套接字连接时,需要进行telnet协商。但由于某种原因,我无法进入上面的“密码:”提示 - (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { NSLog(@"RECEIVE BUFFER %@",data); //store rea

我正试图通过telnet从objective c连接到Cisco C40编解码器。使用计算机上的终端时,我得到:

密码:

但是,在进行套接字连接时,需要进行telnet协商。但由于某种原因,我无法进入上面的“密码:”提示

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

因此,一个大问题来自这样一个事实:提示(登录:或密码:)没有以CR NL(0D:0A)结束行。我在做什么

[self.socket readDataToData:[GCDAsyncSocket CRLFData]带超时:-1标记:0]

因此,我从未阅读过包含提示的数据(一个大问题是wireshark没有工作())。一旦我明白了这一点,我将上面的行更改为:

[self.socket readDataWithTimeout:-1 tag:0];
这成功地给了我提示。以下是我为达到这一点而发送的谈判,以及原始问题所涉及的内容(与更新中的上述内容相同):

终端类型是否为-0xFF、0xFB、0x18

将协商窗口大小-0xFF、0xFB、0x1F

习惯终端速度-0xFF、0xFC、0x20

习惯X显示位置-0xFF、0xFC、0x23

新环境选项-0xFF、0xFB、0x27

次级选择

禁止前进-0xFF、0xFD、0x03

将回显-0xFF、0xFB、0x01

不要状态-0xFF、0xFE、0x05

习惯远程流量控制-0xFF、0xFC、0x21

不会回声-0xFF、0xFC、0x01

Do echo-0xFF、0xFD、0x01

这可能也有帮助。它从流中删除协商字节,因此当您编码以生成字符串时,它不包括协商字节

while([[self.networkBuffer objectAtIndex:0]isEqualToString:@"FF"])
    {
        if ([[self.networkBuffer objectAtIndex:1]isEqualToString:@"FD"] || [[self.networkBuffer objectAtIndex:1]isEqualToString:@"FB"] || [[self.networkBuffer objectAtIndex:1]isEqualToString:@"FE"] || [[self.networkBuffer objectAtIndex:1]isEqualToString:@"FA"]) {

            //most negotiation options are 3 bytes long
            int indexToRemoveFromBuffer = 3;

            //if FA then they are longer then 3 bytes
            if ([[self.networkBuffer objectAtIndex:1]isEqualToString:@"FA"]) {
                //look for indicator of END (F0)
                indexToRemoveFromBuffer = [self.networkBuffer indexOfObject:@"F0"]+1;

            }

            //remove these bytes from networkbuffer
            self.networkBuffer = [NSMutableArray arrayWithArray:[self.networkBuffer subarrayWithRange:NSMakeRange(indexToRemoveFromBuffer, [self.networkBuffer count]-indexToRemoveFromBuffer)]];

            if ([self.networkBuffer count] == 0) {
                if (self.isLoggedIn) {
                    [self.socket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0];//CRLFData
                }else{
                    [self.socket readDataWithTimeout:-1 tag:0];
                }
                return;
            }
        }else{
            break;
        }
}
 negotiate about window size - 0xFF, 0xFA, 0x1F, 0x00, 0x50, 0x00, 0x19
 end - 0xFF, 0xF0

 new enviroment option - 0xFF,0xFA, 0x27, 0x00, 
 end - 0xFF, 0xF0

 Terminal Type (ANSI) -  0xFF,0xFA, 0x18, 0x00, 0x41, 0x4E, 0x53, 0x49, 
 end - 0xFF, 0xF0
while([[self.networkBuffer objectAtIndex:0]isEqualToString:@"FF"])
    {
        if ([[self.networkBuffer objectAtIndex:1]isEqualToString:@"FD"] || [[self.networkBuffer objectAtIndex:1]isEqualToString:@"FB"] || [[self.networkBuffer objectAtIndex:1]isEqualToString:@"FE"] || [[self.networkBuffer objectAtIndex:1]isEqualToString:@"FA"]) {

            //most negotiation options are 3 bytes long
            int indexToRemoveFromBuffer = 3;

            //if FA then they are longer then 3 bytes
            if ([[self.networkBuffer objectAtIndex:1]isEqualToString:@"FA"]) {
                //look for indicator of END (F0)
                indexToRemoveFromBuffer = [self.networkBuffer indexOfObject:@"F0"]+1;

            }

            //remove these bytes from networkbuffer
            self.networkBuffer = [NSMutableArray arrayWithArray:[self.networkBuffer subarrayWithRange:NSMakeRange(indexToRemoveFromBuffer, [self.networkBuffer count]-indexToRemoveFromBuffer)]];

            if ([self.networkBuffer count] == 0) {
                if (self.isLoggedIn) {
                    [self.socket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0];//CRLFData
                }else{
                    [self.socket readDataWithTimeout:-1 tag:0];
                }
                return;
            }
        }else{
            break;
        }
}