【问题标题】:fsockopen - how to detect end of message?fsockopen - 如何检测消息结束?
【发布时间】:2015-03-19 00:04:33
【问题描述】:

我有代码:

$f = fsockopen('mail.myserver.com', 110); //POP3
echo fgets($f, 4096) . '<hr>';
fputs($f, "USER login@myserver.com\r\n");
echo fgets($f) . '<br>';
fputs($f, "PASS mypass\r\n");
echo fgets($f) . '<br>';
fputs($f, "LIST\r\n");
echo fgets($f) . '<br>';
fputs($f, "RETR 1\r\n");

到目前为止一切顺利,但是我有一个循环来接收整个消息:

while (!feof($f)) 
{
echo fgets($f, 1280);
}

因为脚本会等待超时启动,所以它永远不会检测到 EOF。

如何检测 EOF 并在循环超时之前中断循环?如果我使用 telnet,那么一切正常 — 不知何故,telnet 客户端知道何时停止接收。

【问题讨论】:

标签: php sockets pop3 fsockopen


【解决方案1】:

见:

警告 如果 fsockopen() 打开的连接没有被服务器关闭,feof() 将挂起。要解决此问题,请参见以下示例:

开启:feof

解决方法基本上是等待default_socket_timeout,然后终止while循环。

【讨论】:

  • 但是 telnet 客户端如何知道消息何时完成?
  • 我猜telnet确实检测到eof?
【解决方案2】:

Sockets 可能为处理超时/挂起提供更好的替代方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多