2016-03-23 5 views
2

1つの関数でソケットを開き、同じページから別の関数を使用してそのソケットにコマンドを送信することはできますか?私はこれをしようとするとPHP関数間でfsockopenを共有する

私が取得:Warning: fputs(): supplied argument is not a valid stream resource

これは私がどのようにこの作業を取得するために

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); 
} 

任意のアイデアを使用しているコードはありますか? ありがとう

+0

即時理由は '接続()'あなたは_not_したがって、それはときに、ローカルと失わとして扱われ、グローバルとして '$ fp'を内側に宣言しないということです。そうのように私はおそらくそれは私の自己をオブジェクト指向んだろうあなたはその機能を享受する。 – arkascha

+1

しかし、 'global'ステートメントを使うのは本当に悪いスタイルです。あなたがコードを書き直して、それを避けるべきです。通常は、ファイルハンドルをプロパティとして持つクラスを実装します。そうすれば、すべてのメソッドがクラスからインスタンス化された同じオブジェクト上で動作するため、クラスのすべてのメソッドはグローバルにはなりませんが、それにアクセスできます。 – arkascha

+0

あなたのコードによれば、connect()メソッドの最初に$ fpをglobalとして宣言して、cmd()からアクセスできるようにする必要があります。 –

答えて

0

ポインタをグローバルに格納するか、参照渡しする必要があります。ここで

はそれを

$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); 
} 

を行うための一つの方法である私は、このコードが生きるれるコンテキストについてはよく分からないので、異なるまたはより良い戦術を示唆難しいです。ここ

$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); 
    } 
} 
関連する問題