是否可以用一个函数打开一个套接字,并用另一个函数从同一页面向该套接字发送命令?
当我尝试这个时,我得到: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);
}
知道如何让它发挥作用吗?感谢
您需要全局存储指针或通过引用传递指针。
有一种方法
$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);
}
}