2017-08-16 80 views
0

以下代码在与许多设备连接时很有用。但试图连接到要求输入用户名和密码的设备时,它不会。具有身份验证的Swift Telnet流

当通过telnet连接腻子时,思科SX 80等设备在连接后返回登录:提示。

但是当使用下面的代码时,会发生OpenCompleted事件,然后发生HasBytesAvaialable,但缓冲区为空。

将socketSecurityLevel设置为其他任何内容会引发错误,因为它是普通的telnet,而不是SSL。

关于我失踪的任何想法?

func openTcpStream(){ 
if !tcpHost.isEmpty{ 
    Stream.getStreamsToHost(withName: tcpHost, port: tcpPort, inputStream: &inputStream, outputStream: &outputStream) 
    if inputStream != nil{ 
    let input: InputStream = inputStream! 
    input.delegate = self 
    input.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) 
    self.inputStream!.setProperty(StreamSocketSecurityLevel.none, forKey: Stream.PropertyKey.socketSecurityLevelKey) 
    input.open() 

    } 
    if outputStream != nil{ 
    let output: OutputStream = outputStream! 
    output.delegate = self 
    output.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) 
    self.outputStream!.setProperty(StreamSocketSecurityLevel.none, forKey: Stream.PropertyKey.socketSecurityLevelKey) 
    output.open() 

    } 
} 

}

func stream(_ aStream: Stream, handle eventCode: Stream.Event) { 
var event = "" 
switch eventCode { 
case Stream.Event.openCompleted: 
    if writeQueue != ""{ 
    writeTcpStream(bufferToWrite: writeQueue) 

    } 
case Stream.Event.hasBytesAvailable: 
    if inputStream != nil{ 
    readTcpStream(inputStream: inputStream) 

    } 
default:() 

} 

}

func readTcpStream(inputStream: InputStream?){ 
if inputStream != nil{ 
    let input = inputStream! 
    var readBuffer: NSString = "" 
    var readByte = [UInt8](repeating:0, count: 512) 
    while input.hasBytesAvailable{ 
    input.read(&readByte, maxLength: readByte.count) 
    let tempString = NSString(bytes: readByte, length: readByte.count, encoding: String.Encoding.utf8.rawValue) 
    if tempString?.length != nil{ 
     readBuffer = (readBuffer as String) + (tempString! as String) as NSString 
    } 
    } 
} 

}

回答

1

telnet协议不只是通过套接字纯文本。你可以在RFC854

更新:有一个更新的规范RFC5198你可能不需要实现它,如果你不需要Unicode。