在阅读了源代码和标题中提到的原始(法语)网站之后......
<?php
error_reporting(255);
ini_set('display_errors', true);
echo "1<br>";
require_once("telnet_class.php");
$telnet = new Telnet();
$telnet->set_host("10.10.5.7");
$telnet->set_port("2002");
if ($telnet->connect() != TELNET_OK) {
printf("Telnet error on connect, %s\n",$telnet->get_last_error());
}
//$telnet->wait_prompt();
if ($telnet->write('SNRD 1' . "\xd") != TELNET_OK) {
printf("Telnet error on write, %s\n",$telnet->get_last_error());
}
// read to \n or whatever terminates the string you need to read
if ($telnet->read_to("\n") != TELNET_OK) {
printf("Telnet error on read_to, %s\n",$telnet->get_last_error());
}
echo "3<br>";
$result = $telnet->get_buffer();
echo $result;
print_r($result);
// flush_now();
echo "4<br>";
$telnet->disconnect();
?>
好的,解释: get_buffer() 就是这样做的,读取缓冲区中的内容。要在缓冲区中获取某些内容,您必须执行 read_to($match),它将读取到缓冲区中的 $match。之后, get_buffer 应该为您提供所需的字符串。
编辑:如果您找不到跟随您感兴趣的字符串的某些字符串, read_to 将由于 read_to 方法的这一部分而以错误结尾(原始法语评论的翻译是我的):
if ($c === false){
// plus de caracteres a lire sur la socket
// --> no more characters to read on the socket
if ($this->contientErreur($buf)){
return TELNET_ERROR;
}
$this->error = " Couldn't find the requested : '" . $chaine . "', it was not in the data returned from server : '" . $buf . "'" ;
$this->logger($this->error);
return TELNET_ERROR;
}
这意味着当套接字在没有匹配请求字符串的情况下关闭时,将返回 TELNET_ERROR。但是,您要查找的字符串此时应该在缓冲区中......您在 read_to 的参数中添加了什么?"\n" 喜欢我所做的还是只是 "" ?
EDIT2:get_buffer 也有问题。IMO 这门课并不是真正的节省时间 ;-)
//------------------------------------------------------------------------
function get_buffer(){
$buf = $this->buffer;
// cut last line (is always prompt)
$buf = explode("\n", $buf);
unset($buf[count($buf)-1]);
$buf = join("\n",$buf);
return trim($buf);
}
它将丢弃响应的最后一行,在您的情况下是包含答案的那一行。我建议在类中添加一个“轻量级”版本的 get_buffer,就像这样
//------------------------------------------------------------------------
function get_raw_buffer(){
return $this->buffer;
}
并自己在结果中进行必要的修剪/搜索。
您可能还想添加以下常量
define ("TELNET_EOF", 3);
并像这样更改 read_to
...
if ($c === false){
// plus de caracteres a lire sur la socket
if ($this->contientErreur($buf)){
return TELNET_EOF;
}
$this->error = " Couldn't find the requested : '" . $chaine . "', it was not in the data returned from server : '" . $buf . "'" ;
$this->logger($this->error);
return TELNET_EOF;
}
...
为了自己处理这种特殊情况(在您的情况下,结果代码 TELNET_EOF 不必被视为错误)。所以最后你的代码应该或多或少像这样:
// read to \n or whatever terminates the string you need to read
if ($telnet->read_to("\n") == TELNET_ERROR) {
printf("Telnet error on read_to, %s\n",$telnet->get_last_error()); } echo "3<br>";
} else {
$result = $telnet->get_raw_buffer();
echo $result;
print_r($result);
}