【问题标题】:read all data recieved from a socket in PHP读取从 PHP 中的套接字接收到的所有数据
【发布时间】:2010-10-30 08:13:20
【问题描述】:

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

【问题讨论】:

  • telnet 会话是全双工还是半双工?
  • 我不确定。我怎样才能知道?

标签: php sockets telnet


【解决方案1】:

@987654321@() 可能有用。

【讨论】:

  • 我也试过了,没用。根据 PHP 文档 feof() 在文件指针为 EOF 时返回 true,而 fgetc() 在文件指针为 EOF 时返回 false。所以我不确定 $char === false 和 feof() 之间有什么区别。有吗?
  • 可能不会。如果连接完全关闭,则 EOF 将立即返回。如果它会超时,你不会知道。
【解决方案2】:

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

【讨论】:

  • 好主意。我试了一下,发现没有特殊字符。 :D
【解决方案3】:

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

【讨论】:

  • telnet库已经完成,已经工作了很长时间了。我的经理已同意在 Apache 许可证 2.0 版下发布源代码。我会尽快发布下载网址。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2013-07-10
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2014-09-15
    相关资源
    最近更新 更多