Objective c 通过带有GCDAsyncSocket的套接字进行Telnet
我正试图通过telnet从objective c连接到Cisco C40编解码器。使用计算机上的终端时,我得到: 密码: 但是,在进行套接字连接时,需要进行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
- (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;
}
}