0

我正在编写一个简单的 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(文件结尾)字符是什么?

4

4 回答 4

1

我搜索并没有发现任何有用的东西。然后我试图找出python中的telnetlib对这个问题做了什么(我只是在学习python),我发现即使是python库也不搜索EOF。它只是继续读取流,直到超时,或者经过一定时间,或者搜索特殊字符串返回结果。所以我用同样的方法阅读并解决了我的问题。感谢所有的答案和评论。我会尝试说服我的公司分发这个带有开源兼容许可证的 telnet 库。如果发生这种情况,我会在这里更新。

于 2009-06-10T17:23:22.977 回答
1

feof()可能有用。

于 2009-06-01T07:05:36.200 回答
1

尝试回显您收到的每个字符的十六进制值。您应该能够看到您收到的 EOF 内容,即使 PHP 无法识别它。查看ord()bin2hex()

于 2009-06-03T16:51:30.410 回答
0

Telnet 没有流结束标记 (char)。它只是发出提示并停止发送。所以最好的方法是在提示文本上捕获你的输出流。

于 2012-10-05T16:00:49.300 回答