2009-06-01 76 views
0

我在写一个简单的telnet客户端库。我使用fsockopen()打开套接字并使用fgetc()和fwrite()读取和写入套接字。我使用fgetc()而不是fread()来处理Telnet特殊命令和选项,如(IAC,...)。读取从PHP中的套接字接收的所有数据

问题是,我正在从套接字读取大部分时间,它需要很长时间才能返回。正如我所描述的那样,只要连接超时,然后我就会得到结果。

这里是我的阅读方法:

protected function getChar() 
{ 
    $char = fgetc($this->_socket); 
    return $char; 
} // public function getChar() 

目前我用这个条件来确保流结束:

$char = $this->getChar(); 
if ($char === false) { 
    // end of the stream. 
} 

是那里流结束的以找出任何其他方式所有数据都被读取?

更新:我认为Telnet协议中的EOF字符不是PHP期望的EOF,这就是为什么脚本无法找到流结束的原因。有谁知道Telnet协议中的EOF(文件结束)字符是什么?

+1

Telnet会话是全双工还是半双工? – 2009-06-10 06:27:33

+0

我不确定。我怎么知道? – farzad 2009-06-10 17:17:35

回答

1

尝试回显您收到的每个字符的十六进制值。您应该能够看到您正在接收的EOF,即使PHP不承认它。看看ord()bin2hex()

1

feof()这可能是有用的。

+0

我也试过,没有帮助。根据PHP文档feof()返回 当文件指针是EOF时,feof()返回true,当文件指针是EOF时,fgetc()返回false。所以我不确定$ char === false和feof()之间是否有区别。在那儿? – farzad 2009-06-01 07:23:53

+1

可能不是。如果连接完全关闭,EOF将立即返回。如果它要超时,你不会知道。 – grawity 2009-06-01 13:25:41

0

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

0

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