Ich versuche Swift-Snippets zu schreiben, um Befehle an Telnet zu senden, aber ich muss mich zuerst einloggen.
Unter OSX habe ich einen Telnet-Dienst generiert: launchctl load -F /System/Library/LaunchDaemons/telnet.plist
. Danach kann ich mich von anderen Computern mit IP verbinden: XXX.XXX.X.XXX
port 23
.
Zum Beispiel von Windows 7:
%Vor%In der Befehlszeile fragt mich Telnet nach dem Benutzer und dem Passwort. Danach kann ich alle Linux-Befehle ausführen. So weit so gut.
Ich habe das Telnet-Modul für Android geschrieben, damit der OSX-Telnet-Dienst ordnungsgemäß funktioniert. Das bedeutet, dass ich login:
und password:
Ausgaben sehe, damit ich damit umgehen kann.
Jetzt bin ich mit iOS Swift festgefahren, ich habe gegoogelt und eine ziemlich gute Lösung gefunden, die in meinem Fall funktionieren sollte:
Also habe ich meine Hausaufgaben geschrieben:
%Vor% Stream Callback Override-Methode von NSStreamDelegate
:
Zuerst passiert nichts, wenn ich initNetworkCommunication()
aufrufen möchte. Ich erwarte Aufruf von func stream
oder ich liege falsch? . Es sollte NSStreamEvent.HasBytesAvailable
state sein oder ich liege falsch?
Wenn ich sendMessage("snags")
aufruft, erhalte ich eine Antwort in stream
, die auf case NSStreamEvent.HasSpaceAvailable
fällt. Was bedeutet das?
Meine erwarteten Ergebnisse: bei connect sollte ich login:
output bekommen aber nichts bekommen.
Sie sind fast fertig mit NStreamDelegate, aber Sie müssen 'rfc 854 telnet protocol specification' kennen.
Vorhergehende Kommunikation erfordert eine Telnet-Verhandlung zwischen Host und Ihrem Code.
Lassen Sie in Ihrem Callback-Fall "NSStreamEvent.HasBytesAvailable" Ihren Pufferspeicher frei und konvertieren Sie ihn in NSData, wie
%Vor%Sie werden
erhalten %Vor%Dies ist die Telnet-Aushandlung, die Sie entsprechend der Spezifikation ausführen müssen.
2. Frage.
NStreamEvent.HasSpaceAvailable bedeutet, dass 'Ein boolescher Wert, der angibt, ob der Empfänger beschrieben werden kann.'
Bevor Sie eine Nachricht über NSOutputStream senden, müssen Sie die hasSpaceAvailable-Eigenschaft von NSOutputStream in Ihrer Methode "sendMessage" überprüfen.
Oder verwenden Sie die Warteschlange für die zu sendenden Daten und senden Sie sie, wenn sie auf NStreamEvent.HasBytesAvailable fallen, das ist meine Empfehlung.
Siehe diese Antwort. Verwendung von NSInputStream und NSOutputStream