php telnet没有来自脚本的响应
我正在Windows XP Professional上运行PHP5。我正在尝试编写一个telnet php脚本,它只是连接、发送一个文本字符串并获取响应缓冲区并输出它。我在这里使用telnet类文件: 我在另一个帖子里找到的php telnet没有来自脚本的响应,php,telnet,Php,Telnet,我正在Windows XP Professional上运行PHP5。我正在尝试编写一个telnet php脚本,它只是连接、发送一个文本字符串并获取响应缓冲区并输出它。我在这里使用telnet类文件: 我在另一个帖子里找到的 <?php error_reporting(255); ini_set('display_errors', true); echo "1<br>"; require_once("telnet_class.php"); $telnet = new T
<?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");
$telnet->connect();
//$telnet->wait_prompt();
$telnet->write('SNRD 1%0d');
echo "3<br>";
$result = $telnet->get_buffer();
echo $result;
print_r($result);
// flush_now();
echo "4<br>";
$telnet->disconnect();
?>
我没有收到任何错误或回应。如果我发送了一个无效的字符串,我至少应该得到一个“ERR”响应,但是我甚至没有得到这个响应。知道我做错了什么吗?如果在命令提示符下执行相同的操作,则会收到所需的字符串输出。这可能是因为write函数正在发送您不能像那样插入十六进制值。远程进程只会看到
SRND 1%0d
现在它正在等待线路终止。试试这个
$telnet->write('SNRD 1' . "\r");
或
双引号非常关键,请参见
编辑:
您可以尝试添加一些错误报告,因为现在您没有进行太多检查(错误报告不会显示telnet类中的任何错误)。。。。例如:
<?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());
}
echo "3<br>";
$result = $telnet->get_buffer();
echo $result;
print_r($result);
// flush_now();
echo "4<br>";
$telnet->disconnect();
?>
而且
if ($ajouterfinLigne){
$buffer .= "\n";
}
?
另外,您是否使用命令行telnet客户端测试了主机和端口?像
telnet 10.10.5.7 2002
?您检查过telnet类是如何工作的吗?也许它不是为在windows下运行而设计的。如果是一个简单的套接字,可以考虑使用常规的套接字连接。 如果您打开了一个未关闭的套接字,那么只要脚本正在运行,就应该在netstat中使用一个条目
netstat-na | find“:2002”
在阅读源代码和标题中提到的原始(法语)站点之后
<?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();
?>
这意味着,当套接字在没有与请求字符串匹配的情况下关闭时,将返回TELNET_错误。但是,此时您要查找的字符串应该在缓冲区中。。。。你在雷丁的论点中加入了什么?“\n”像我做的那样还是仅仅“
编辑2:
get_缓冲区也有问题。在我看来,这个类并不是真正的省时工具;-)
它将丢弃响应的最后一行,在您的例子中,就是包含
答复
我建议在类中添加一个“轻”版本的get_buffer,如下所示
//------------------------------------------------------------------------
function get_raw_buffer(){
return $this->buffer;
...
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;
}
...
}
然后自己在结果中进行必要的修剪/搜索
您可能还需要添加以下常量
define ("TELNET_EOF", 3);
把read_改成这样
//------------------------------------------------------------------------
function get_raw_buffer(){
return $this->buffer;
...
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);
}
//读取到\n或任何终止需要读取的字符串的内容
如果($telnet->read_to(“\n”)==telnet_ERROR){
printf(“Telnet在读取%s\n时出错,$Telnet->get_last_error());}echo“3
”;
}否则{
$result=$telnet->get_raw_buffer();
回声$结果;
打印(结果);
}
你确定你的连接成功了吗?有没有办法不用运行wireshark或ethereal来测试它?我在类中运行了connect语句,它似乎正在连接。我尝试了,似乎得到了相同的结果。我是否可能遇到连接问题?我假设我至少会得到某种输出或响应..当我手动telnet时。。我输入不带引号的“SNRD 1”,然后按enter键,它会弹出正确的返回字符串,所以我猜我需要一个返回字符串?这有帮助吗?找到了-我会尽快回复,就像它的连接一样。。当我注释掉disconnect命令并运行netstat时,它显示为“TCP 10.100.5.2:1703 10.100.5.7:2002 TIME_WAIT”TIME_WAIT可能意味着连接已经关闭(可能是远程端),您的连接刚刚正常完成。默认设置为等待240秒。你应该检查你的远端,看看它是否被正确处理。太棒了。取得了一些好的进展。。终于得到了回应读取“”时出现Telnet错误,找不到请求的:“”,它不在从服务器返回的数据中:“U 808912889”。“U 808912889”是我正在寻找的正确响应,不知道请求的“”错误是什么…phill,这个类的工作方式将一直读取,直到找到某个字符串。等等,我将编写另一个回复或编辑此回复;-)我几乎绝望了;-)很乐意帮忙!
...
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;
}
...
// 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);
}