2014-06-09 17 views
6

recv() işlevinin nasıl çalıştığını anlamakta zorlanıyorum. Paramiko Channel.recv() tam olarak nasıl çalışır?

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

Bunun bir yığın bir veri işlevi çağırmak her zaman alıyor anlıyoruz, fakat kimse bu verilerin yapının veya boyutuna detaylandırabileceğiniz? Ben bir komut date göndermek Diyelim, ben dikkat edin:

  • 1 okuma alır: "tarih"
  • 2 okuma alır: Gerçek yanıt (Pzt Haz 2014 9 00:04:17 CDT)
  • 3 okuma alır: komut istemi

Ancak bu, terminalde rastgele görünen iletileri ayıklarken nasıl işler?

Gerçek desen maksimum bayttan (nbytes) daha az olduğu sürece önceki model doğru mu?

nbytes'u aşarsa ne olur?

isteğe göre, aşağıda bir kod parçası eklenmiştir: bir socket.recv(), bunun, herhangi bir yapı veya boyutuna sahip değildir için

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

Bu bayt_sayisi kadar almalıdır: Eğer bekliyor veri parçasını elde edene kadar

Sen yaygın bir döngüde recv() kullanın. Daha büyük bir şey ve maksimum byte yığınına kadar giderdi. Daha az herhangi bir şey ve her şey, maksimum boyuttan daha az olduğu için geri dönecektir. Bir dahaki sefere channel.recv çağırdığınızda, bu son ısırmanın kaldığı yerden devam eder. Komutta bıraktığı yerden nerede olursa olsun, sadece belirtilen maksimum bayt sayısını alacaktır. Stderr'e gönderilen her türlü sorgunun recv_stderr kullanması gerekir. Bu, sorunuza cevap verip vermediğinden emin değil. – Bob

+0

bunlardan biri ummm :) ... Bir komut göndermek ve recv komutunu çağırmak bana gerçek cevabı vermek yerine komutun kendisini alır – user3388884

+0

Gönderdiğiniz ve yeniden yazdığınız kodu görebilir miyiz? Onu nasıl yazdığın basit bir şey olabilir, farketmemiş olabilirsiniz. – MikeRixWolfe

cevap

0

Kanal recv() karşılık gelecek MaxBytes'i aşmayan uzak sunucudan gönderilen her türlü veriyi okur.

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 
İlgili konular