越过服务器,如何读取直到当前传输结束?

时间:2015-02-18 09:31:11

标签: php sockets fsockopen

我正在编写一个连接服务器,发送请求,读取响应和发送其他命令的工具。

问题是服务器发送的响应在行数方面会有所不同(它总是至少有一行,但可以是3,5行),他可以发送一行,等待几秒钟,然后发送其他行。

有没有办法读取所有传入的数据,直到它们停止? 也许我必须改为sockets

以下是我的尝试:

$fp = fsockopen("www.example.com", 25, $errno, $errstr, 30);

-

while(fgets($fp, 1024)) {} // hangs

-

fgets($fp, 4096); // works, but doesn't get the multiple lines

-

while(!feof($fp)){
    fgets($fp, 1024);
}
// hangs

-

while(($c = fgetc($fp))!==false) {
   var_dump($c);
}
// hangs

1 个答案:

答案 0 :(得分:2)

您正在使用TCP连接。除非其中一个通信伙伴明确关闭,否则TCP连接将保持打开状态。

这意味着

while(!feof($fp)) {
    fgets($fp);
}
除非服务器在传输后关闭连接,否则

将永久挂起。 (似乎远程服务器)。这同样适用于while(fgets($fp, 1024)) {}

另一个选项是客户端(您的PHP脚本)关闭连接。只有当客户端知道消息的大小并且可以决定何时发送所有字节时,才能安全地完成此操作。

实现这是一个协议功能,在HTTP中,例如使用内容长度标头。

如果您连接到端口25,我假设您正在与SMTP服务器通话。 SMTP将消息长度作为协议功能进行管理。您需要实施SMTP协议。


关于:

$message = fgets($fp, 4096);
只有在确定消息永远不会超过4096字节时,才能“工作”。新行仍然在结果中,您只需要

$lines = explode("\n", $message);