我正在编写一个简单的telnet客户端库。我使用fsockopen()打开套接字,并使用fgetc()和fwrite()读取和写入套接字。我使用fgetc()而不是fread()来处理Telnet特殊命令和选项,如(IAC,...)。
问题是我大部分时间都是从套接字读取,返回时间太长。正如我所描述的那样,只要连接超时,就可以获得结果。
这是我的阅读方法:
protected function getChar()
{
$char = fgetc( $this->_socket );
return $char;
} // public function getChar()
目前我使用此条件确保流已完成:
$char = $this->getChar();
if ( $char === false ) {
// end of the stream.
}
有没有其他方法可以找出流已完成并且所有数据都被读取了?
Udate:我认为Telnet协议中的EOF字符不是PHP期望的EOF,这就是脚本无法找到流的结尾的原因。有谁知道Telnet协议中的EOF(文件结尾)字符是什么?
答案 0 :(得分:1)
feof()
可能有用。
答案 1 :(得分:1)
答案 2 :(得分:0)
我搜索过,但没有找到任何有用的东西。然后我试图找出python中的telnetlib为这个问题做了什么(我只是学习python),我发现即使是python库也不会搜索EOF。它只是继续读取流,直到它超时,或经过一定的时间,或搜索特殊的字符串返回结果。所以我使用相同的方法阅读并解决了我的问题。感谢所有的答案和评论。我将试图说服我的公司使用开源兼容许可证分发此telnet库。如果发生这种情况,我会在这里更新。
答案 3 :(得分:0)
Telnet没有流令牌(char)的结尾。 它只是发出提示并停止发送。 因此,最好的方法是将输出流捕获到提示文本上。