Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php telnet没有来自脚本的响应_Php_Telnet - Fatal编程技术网

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

我正在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 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);
}