2014-06-09 7 views
6

मुझे समझ में मुश्किल हो रही है कि recv() फ़ंक्शन कैसे काम करता है।paramiko Channel.recv() वास्तव में कैसे काम करता है?

http://docs.paramiko.org/en/1.13/api/channel.html#paramiko.channel.Channel.recv

मैं समझता हूँ कि यह एक हिस्सा एक डेटा हर बार जब आप फ़ंक्शन को कॉल प्राप्त कर रहा है, लेकिन कोई संरचना या इस डेटा के आकार पर विस्तृत कर सकते हैं? कहते हैं कि चलो मैं एक कमांड date भेजने के लिए, मैं नोटिस:

  • 1 पढ़ा हो जाता है: "तिथि"
  • 2 पढ़ा हो जाता है: वास्तविक प्रतिक्रिया (सोम जून 9 12:04:17 CDT 2014)
  • 3 पढ़ने हो जाता है: प्रॉम्प्ट

लेकिन यह टर्मिनल पर यादृच्छिक रूप से दिखाई देने वाले संदेशों को डिबग करने वाले संदेशों को कैसे प्रबंधित करता है?

क्या पिछले पैटर्न वास्तविक बाइट्स (nbytes) से कम वास्तविक प्रतिक्रिया तक सत्य है?

क्या होता है यदि यह nbytes से अधिक हो जाता है?

अनुरोध के अनुसार, मैं नीचे कोड का एक टुकड़ा जोड़ दिया है: एक socket.recv(), यह किसी भी विशिष्ट संरचना या आकार नहीं है करने के लिए

while reads<maxReads: 
    resp = self.__chan.recv(maxBytes) 
    print resp 
    self.__buffer += resp 
    if resp.endswith('$ ') or resp.endswith('# '): 
     break 
    reads += 1 
+1

यह nbytes अप करने के लिए प्राप्त करना चाहिए। कुछ भी बड़ा और यह अधिकतम बाइट खंड तक ले जाएगा। कुछ भी कम और यह सब कुछ वापस कर देगा क्योंकि यह अधिकतम आकार से कम है। अगली बार जब आप channel.recv को कॉल करेंगे तो यह जारी रहेगा कि आखिरी काटने वाला कहां छोड़ा गया था। इससे कोई फर्क नहीं पड़ता कि यह कहां छोड़ दिया गया आदेश में केवल निर्दिष्ट बाइट्स की अधिकतम संख्या तक ही ले जाएगा। Stderr को डाले गए किसी भी संकेत को recv_stderr का उपयोग करने की आवश्यकता होगी। सुनिश्चित नहीं है कि क्या यह आपके प्रश्न का उत्तर देता है। – Bob

+0

उनमें से एक ummm :) ... एक कमांड भेज रहा है, और अगली बार आरईवी को कॉल करने से मुझे वास्तविक प्रतिक्रिया – user3388884

+0

की बजाय कमांड मिल जाता है, क्या हम उस कोड को देख सकते हैं जहां आप भेजते हैं और recv? यह कुछ आसान हो सकता है कि आपने इसे कैसे लिखा है, आपने देखा नहीं होगा। – MikeRixWolfe

उत्तर

0

चैनल recv() से मेल खाती है यह बस दूरस्थ सर्वर से जो भी डेटा भेजा गया था, पढ़ता है, अधिकतम बाइट्स से अधिक नहीं।

आप आमतौर पर recv() एक पाश में उपयोग करें जब तक आप डेटा का एक टुकड़ा है कि आप के लिए इंतजार कर रहे हैं मिलता है:

def _wait_for_data(self, options, verbose=False): 
    chan = self.chan 
    data = "" 
    while True: 
     x = chan.recv(1024) 
     if len(x) == 0: 
      self.log("*** Connection terminated\r") 
      sys.exit(3) 
     data += x 
     if verbose: 
      sys.stdout.write(x) 
      sys.stdout.flush() 
     for i in range(len(options)): 
      if re.search(options[i], data): 
       return i 
    return -1 
संबंधित मुद्दे