2015-09-12 15 views
8

मैं टेलनेट को कमांड भेजने के लिए स्विफ्ट स्निपेट लिखने की कोशिश करता हूं लेकिन मुझे पहले लॉग इन करने की आवश्यकता है।टेलनेट खाली आउटपुट और लॉगिन/पासवर्ड अनुपस्थित हो जाता है

ओएसएक्स पर मैंने एक टेलनेट सेवा उत्पन्न की: launchctl load -F /System/Library/LaunchDaemons/telnet.plist। इसके बाद मैं अन्य कंप्यूटरों से आईपी में कनेक्ट करने में सक्षम हूं: XXX.XXX.X.XXX पोर्ट 23

विंडोज 7 से

उदाहरण के लिए:

telnet XXX.XXX.X.XXX 23 
..... 
Darwin/BSD (fess.local) (ttys009) 

login: snaggs 
Password:xxxxxx 

snaggs:~ lur$ 

कमांड लाइन में, टेलनेट उपयोगकर्ता और पासवर्ड के लिए मुझे पूछता है। इसके बाद मैं किसी भी लिनक्स कमांड चला सकता हूं। अब तक सब ठीक है।

मैंने एंड्रॉइड के लिए टेलनेट मॉड्यूल लिखा है ताकि ओएसएक्स टेलनेट सेवा ठीक से काम करे। इसका मतलब है कि मैं login: और password: आउटपुट देखता हूं इसलिए मैं इसे संभालने में सक्षम हूं।

अब मैं आईओएस स्विफ्ट के साथ फंस कर रहा हूँ, मैं Google पर और बहुत अच्छा समाधान है कि मेरे मामले में काम करना चाहिए पाया:

तो मैं अपने घर काम लिखा था :

class TelnetClient : NSObject, NSStreamDelegate{ 

    private var inputStream: NSInputStream! 
    private var outputStream: NSOutputStream! 


func initNetworkCommunication(){ 
     let host : CFString = "XXX.XXX.X.XXX" 
     let port : UInt32 = 23 
     var readstream : Unmanaged<CFReadStream>? 
     var writestream : Unmanaged<CFWriteStream>? 

     CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, &readstream, &writestream) 

//  var _inputStream: NSInputStream? 
//  var _outputStream: NSOutputStream? 
//  NSStream.getStreamsToHostWithName("XXX.XXX.X.XXX", port: 23, inputStream: &_inputStream, outputStream: &_outputStream) 
//  self.inputStream = _inputStream! 
//  self.outputStream = _outputStream! 


     self.inputStream = readstream!.takeRetainedValue() 
     self.outputStream = writestream!.takeRetainedValue() 

     self.inputStream.delegate = self 
     self.outputStream.delegate = self 


     self.inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) 
     self.outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) 

     self.inputStream.open() 
     self.outputStream.open() 

    } 


func sendMessage(message:String){ 

    let data: NSData = message.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion: true)! //NSUTF8StringEncoding 
    let stream: NSInputStream = NSInputStream(data: data) 

     var buffer = [UInt8](count: 8, repeatedValue: 0) 
     stream.open() 

     if stream.hasBytesAvailable { 
      let result :Int = stream.read(&buffer, maxLength: buffer.count) 
     } 
     self.outputStream.write(&buffer, maxLength: buffer.count) 

     println("wrote to Server: \(message)") 
    } 

} 

स्ट्रीम कॉलबैक मेथ ओवरराइड NSStreamDelegate से आयुध डिपो:

सभी की
func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) { 
     switch (eventCode){ 
     case NSStreamEvent.ErrorOccurred: 
      NSLog("ErrorOccurred") 
      break 
     case NSStreamEvent.EndEncountered: 
      NSLog("EndEncountered") 
      break 
     case NSStreamEvent.None: 
      NSLog("None") 
      break 
     case NSStreamEvent.HasBytesAvailable: 
      NSLog("HasBytesAvaible") 
      // ... NEVER ENTERS HERE 
      var buffer = [UInt8](count: 4096, repeatedValue: 0) 
     if (aStream == self.inputStream){ 

      while (self.inputStream.hasBytesAvailable){ 
       var len = self.inputStream.read(&buffer, maxLength: buffer.count) 
       if(len > 0){ 
        var output = NSString(bytes: &buffer, length: buffer.count, encoding: NSUTF8StringEncoding) 
        if (output != ""){ 
         NSLog("server said: %@", output!) 
        } 
       } 
      } 
     } 
      break 
     //case NSStreamEvent.allZeros: 
     // NSLog("allZeros") 
     //  break 
     case NSStreamEvent.OpenCompleted: 
      NSLog("OpenCompleted") // <-- called on initialisation 
      break 
     case NSStreamEvent.HasSpaceAvailable: 
      NSLog("HasSpaceAvailable") 
      break 
     default: 
      NSLog("default") 
      break 

     } 
    } 

सबसे पहले, कुछ भी नहीं होता है जब मैं initNetworkCommunication() कॉल करने के लिए प्रयास करें। मुझे func streamपर कॉल करने की उम्मीद है या मैं गलत हूं?। यह NSStreamEvent.HasBytesAvailable राज्य होना चाहिए या मैं गलत हूँ?

जब मैं sendMessage("snags") कहते हैं, मैं stream कि case NSStreamEvent.HasSpaceAvailable पर पड़ता है में प्रतिक्रिया मिल। इसका क्या अर्थ है?


मेरे अपेक्षित परिणाम: कनेक्ट होने पर मैं login: उत्पादन मिलता है लेकिन कुछ भी नहीं मिलना चाहिए।

+0

@Brian कारण है कि आप शीर्षक से 'स्विफ्ट iOS' को दूर किया? यह प्रश्न आईओएस स्विफ्ट को संदर्भित करता है और सटीक टेलनेट – snaggs

+0

शीर्षक में टैग शामिल करना अनावश्यक है और अव्यवस्था बनाता है। टैग सुनिश्चित करेंगे कि यह स्पष्ट है कि विषय क्या हैं। आप [इस मेटा प्रश्न] में अधिक पढ़ सकते हैं (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles)। – Brian

+0

NSStream आप सिर दर्द का एक बहुत, मैं वास्तव में रोबी हैन्सन द्वारा तीसरे पक्ष के ढांचे की तरह [CocoaAsyncSocket] (https://github.com/robbiehanson/CocoaAsyncSocket) उपयोग करने की अनुशंसा दे देंगे, आपको बस इतना करना है शामिल है 'GCDAsyncSocket.h 'आपके' पुल-हेडर.h' – Xrait

उत्तर

-1

आप लगभग NSStreamDelegate के बारे में किए गए हैं, लेकिन आपको 'आरएफसी 854 टेलनेट प्रोटोकॉल विनिर्देश' जानने की आवश्यकता है।

पिछले संचार में मेजबान और आपके कोड के बीच एक टेलनेट वार्ता की आवश्यकता है।

अपने कॉल वापस की 'NSStreamEvent.HasBytesAvailable' मामले, अपने बफर डंप NSData को बदलने में,

NSLog("%@", NSData(bytes: buffer, length: len)) 

की तरह आप

<fffd18ff fd20fffd 23fffd27 fffd24> 

मिल जाएगा जो टेलनेट बातचीत है कि आप अनुसार जवाब चाहिए है विनिर्देश के लिए।

2 प्रश्न।

NSStreamEvent.HasSpace उपलब्ध का अर्थ है कि 'एक बूलियन मान जो इंगित करता है कि रिसीवर को लिखा जा सकता है या नहीं।'

इससे पहले कि आप NSOutputStream के माध्यम से संदेश भेजते हैं, क्या आप 'SendMessage' विधि में NSOutputStream की hasSpaceAvailable संपत्ति की जांच करनी होगी।

या डेटा के लिए उपयोग कतार भेजा और उसे भेज जब NSStreamEvent.HasBytesAvailable पर गिर जाते हैं, यह मेरी सिफारिश है किया जाना है।

इस उत्तर को देखें। How to use NSInputStream and NSOutputStream

+0

कनेक्ट पर मुझे अनुरोध भेजने के बाद 'NSStreamEvent.OpenCompleted' केस मिलता है, मुझे 'NSStreamEvent.HasSpace उपलब्ध' मिलता है लेकिन कभी भी' NSStreamEvent.HasBytesAvailable' – snaggs

+0

कुछ भी नहीं होता है जब मैं 'self.outputStream.write (& buffer, maxLength: buffer चलाता हूं) .count) ' – snaggs

संबंधित मुद्दे