После некоторого чтения в исходном коде и на оригинале (французский) сайта, указанного в заголовке ....
<?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 должен предоставить вам нужную строку.
EDIT: если вы не можете найти строку, которая следует за строку, которую вы заинтересованы в 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);
}
Вы уверены, что ваше соединение преуспевает? –
Есть ли способ проверить, что без прогона провода или эфира? – phill
Я запустил инструкцию connect в классе и, похоже, подключился. – phill