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

fget over server, how to read until end of current transmission?

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

问题是服务器发送的响应在行数方面可能会有所不同(它总是至少一行,但可以是 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

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

这意味着

while(!feof($fp)) {
    fgets($fp);
}

除非服务器在传输后关闭连接,否则将永远挂起。 (似乎远程服务器 而不是 )。这也适用于 while(fgets($fp, 1024)) {}

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

实现这是一项协议功能,例如在 HTTP 中使用 content-length header。

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


关于:

$message = fgets($fp, 4096);

"works"只有在确定消息永远不会超过4096字节的情况下。换行符仍在结果中,您只需要

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