2016-03-23 18 views
2

Tek bir işlevli soketi açmak ve aynı sayfaya başka bir işlevle bu sokete komut göndermek mümkün mü? Bunu çalıştığınızdaPHP fsockopen işlevler arasında paylaşın sayfa

alıyorum: Warning: fputs(): supplied argument is not a valid stream resource

Bu benim nasıl olacak bu iş almak için

connect(); 
cmd("cd /home/tom\n ls\n"); 
close(); 

function connect() { 
    global $passwd; 
    if (!$fp = @fsockopen("127.0.0.1", 23, $errno, $errstr, 5)) { 
     exit('Login Failed'); 
    } 
    stream_set_timeout($fp, 1); 

    fputs($fp, "tom\n"); sleep(1); 
    fputs($fp, "$passwd\n"); sleep(1); 
    $res = fread($fp,1024); 
    var_dump($res); 
} 

function cmd ($cmd) { 
    global $fp; 
    fputs($fp, $cmd); sleep(1); 
    $res = fread($fp,1024); 
    var_dump($res); 
} 

function close() { 
    global $fp; 
    fclose($fp); 
} 

herhangi bir fikir kullanıyorum kodudur? Teşekkürler

+0

burada anki neden içeride 'sen _not_' beyan küresel olarak $ fp' do ') (bağlamak olduğunu ve ne zaman kaybetti: Ben muhtemelen şöyle kendime nesne yönelimli yapardı fonksiyonu sen yap. – arkascha

+1

Ancak, 'global' deyimini kullanmak gerçekten kötü bir stil olsa da, kodunuzu yeniden yazmanız için yeniden yazmanız gerekir. Tipik olarak bir dosya tanıtıcısını bir özellik olarak tutan bir sınıf uygular. Bu şekilde, sınıfın tüm yöntemleri, küresel olmasa da, ona erişebilir, çünkü tüm yöntemler sınıftan çıkarılmış olan aynı nesne üzerinde çalışır. – arkascha

+0

Kodunuza göre, cmd() 'den erişilebilir olmak için connect() yönteminin başlangıcında global olarak $ fp bildirmelisiniz. –

cevap

0

İşaretçiyi global olarak kaydetmeniz veya referans olarak iletmeniz gerekir.

İşte o

$fp = connect($passwd); 
cmd($fp, "cd /home/tom\n ls\n"); 
close($fp); 

function connect ($passwd) { 
    if (!$fp = @fsockopen("127.0.0.1", 23, $errno, $errstr, 5)) { 
     exit('Login Failed'); 
    } 
    stream_set_timeout($fp, 1); 

    fputs($fp, "tom\n"); sleep(1); 
    fputs($fp, "$passwd\n"); sleep(1); 
    $res = fread($fp,1024); 
    var_dump($res); 

    return $fp; 
} 

function cmd ($fp, $cmd) { 
    fputs($fp, $cmd); sleep(1); 
    $res = fread($fp,1024); 
    var_dump($res); 
} 

function close ($fp) { 
    fclose($fp); 
} 

Bu kod yaşayacak hangi bağlamda hakkında emin değilim yapmanın bir yolu, bu yüzden farklı ya da daha iyi taktikleri düşündüren zor. bu nedenle yerel olarak ele alınır,

$command = new Command($passwd); 
if($command->connect()){ 
    $res = $command->cmd("cd /home/tom\n ls\n"); 
    // Use $result of cmd() here 

    $command->close(); // close when done 
} 

class Command { 

    private $fp; 
    private $passwd; 

    public function __construct($passwd) { 
     $this->passwd = $passwd; 
    } 

    public function connect() { 
     if (!$p = @fsockopen("127.0.0.1", 23, $errno, $errstr, 5)) { 
      return false; // Or throw an exception 
     } 
     stream_set_timeout($fp, 1); 

     fputs($fp, "tom\n"); sleep(1); 
     fputs($fp, "$passwd\n"); sleep(1); 
     $res = fread($fp,1024); 
     var_dump($res); 

     $this->fp = $fp; 
     return true; // Or $res if you want to use it somewhere else 
    } 

    function cmd ($cmd) { 
     $fp = $this->fp; 

     fputs($fp, $cmd); sleep(1); 
     $res = fread($fp,1024); 
     var_dump($res); 

     return $res; // if you want to use it else where 
    } 

    function close() { 
     fclose($this->fp); 
    } 
}