在PHP中读取从套接字接收的所有数据

在PHP中读取从套接字接收的所有数据,php,sockets,telnet,Php,Sockets,Telnet,我正在编写一个简单的telnet客户端库。我使用fsockopen()打开套接字,并使用fgetc()和fwrite()读取和写入套接字。我使用fgetc()而不是fread()来处理Telnet特殊命令和选项,如(IAC,…) 问题是,大多数时候我从套接字读取数据时,返回的时间太长。正如我所描述的,只要连接超时,就需要更长的时间,然后我就可以得到结果 以下是我的阅读方法: protected function getChar() { $char = fgetc( $this->_

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

有一些可能有用。

有一些可能有用。

有一些可能有用。

尝试回显收到的每个字符的十六进制值。您应该能够看到作为EOF接收到的内容,即使PHP无法识别它。查看并尝试回显收到的每个字符的十六进制值。您应该能够看到作为EOF接收到的内容,即使PHP无法识别它。我搜索了一下,没有发现任何有用的东西。然后我试图找出python中的telnetlib对这个问题的作用(我只是在学习python),我发现即使是python库也不会搜索EOF。它只是一直读取流,直到超时,或经过一定时间,或搜索特殊字符串返回结果。所以我用同样的方法阅读并解决了我的问题。谢谢你的回答和评论。我将试图说服我的公司使用与开源兼容的许可证分发此telnet库。如果发生这种情况,我将在此处更新。

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

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

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

我也尝试过,但没有帮助。根据PHP文档,当文件指针为EOF时,feof()返回true,当文件指针为EOF时,fgetc()返回false。所以我不确定$char==false和feof()之间是否有任何区别。有吗?可能没有。如果连接完全关闭,则EOF将立即返回。如果它要超时,你不会知道的。我也试过了,没用。根据PHP文档,当文件指针为EOF时,feof()返回true,当文件指针为EOF时,fgetc()返回false。所以我不确定$char==false和feof()之间是否有任何区别。有吗?可能没有。如果连接完全关闭,则EOF将立即返回。如果要暂停,你不会知道的。好主意。我试了一下,发现没有什么特别的特征好主意。我试了一下,发现没有什么特别的特征是全双工还是半双工?我不确定。我怎么知道?telnet会话是全双工还是半双工?我不确定。我怎么知道呢?telnet库已经完成,并且已经工作了很长时间。我的经理已经同意在Apache许可证版本2.0下发布源代码。我很快就会发布下载URL。telnet库已经完成,并且已经工作了很长时间。我的经理已经同意在Apache许可证版本2.0下发布源代码。我会尽快发布下载URL。