首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中正确和快速地使用TELNET。套接字或cURL

问在PHP中正确和快速地使用TELNET。套接字或cURL
EN

Stack Overflow用户
提问于 2011-12-07 06:18:04
回答 3查看 13.7K关注 0票数 5

PHP中TELNET实现的几乎所有示例都使用套接字(fsockopen)。这对我不起作用,因为它需要不可接受的时间(~ 60秒)。

我为了其他目的尝试了fsockopen,发现它比cURL慢。

问题1:为什么套接字速度慢?

更新:我发现我们需要设置超时函数,并且可以控制套接字的执行时间。我很好奇如何设置适当的超时,或者如何在收到响应后“停止等待”。

我不能用cURL实现相同的东西。我应该把我需要发送到telnet的命令放在哪里?CURLOPT_CUSTOMREQUEST是正确的选择吗?我在做这样的事情:

代码语言:javascript
复制
class TELNETcURL{

    public $errno;
    public $errstr;
    private $curl_handle;
    private $curl_options = array(
        CURLOPT_URL => "telnet://XXX.XXX.XXX.XXX:<port>",
        CURLOPT_TIMEOUT => 40,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_HEADER => FALSE,
        CURLOPT_PROTOCOLS => CURLPROTO_TELNET
    );

    function __construct(){
        $this->curl_handle = curl_init();
        curl_setopt_array($this->curl_handle, $this->curl_options);
    }

    public function exec_cmd($query) {
        curl_setopt($this->curl_handle, CURLOPT_CUSTOMREQUEST, $query."\r\n");
        $output = curl_exec($this->curl_handle);
        return $output;
    }

    function __destruct(){
        curl_close($this->curl_handle);
    }

}

然后类似这样的东西:

代码语言:javascript
复制
$telnet = new TELNETcURL();
print_r($telnet->exec_cmd("<TELNET commands go here>"));    

我得到“最大执行时间超过30秒”的curl_exec命令。

问题2:,cURL实现有什么问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-07 15:18:42

套接字并不慢。套接字是通信的基础。Curl使用套接字打开到远程服务器的连接。一切都在套接字上工作(我想)。我不认为您可以使用curl来使用telnet服务,嗯,这不是完全正确的,我想您可以连接并发送一个命令。Curl的设计考虑了http协议的无状态性(打开连接、发送请求、等待回复和关闭连接)。套接字是唯一的选择。

我得到“最大执行时间超过30秒”的curl_exec命令。

我猜远程服务器是罪魁祸首。检查它是否使用常规终端客户端工作,或者在php中增加max_execution_time。

更新

似乎可以将curl用于telnet,请检查以下内容:http://www.cs.sunysb.edu/documentation/curl/

但我还是觉得你最好用插座。

票数 2
EN

Stack Overflow用户

发布于 2011-12-08 11:33:19

您需要做的是使用非阻塞IO,然后使用Poll作为响应。你现在正在做的是等待/等待一个永远不会到来的回应

就我个人而言,我用php编写了许多套接字应用程序--它们工作得很好--而且我讨厌cURL的错误、繁琐和高度不安全.只要读一下他们的窃听器列表,你就应该感到震惊。

去阅读出色的PHP手册,其中包含了许多如何执行轮询IO的示例,他们甚至给出了一个telnet服务器和客户端示例。

票数 3
EN

Stack Overflow用户

发布于 2014-02-20 11:14:48

使用pfsockopen而不是fopensock ..its要快得多,并且始终保持连接正常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8411182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档