越过服务器,如何读取直到当前传输结束?
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);
我正在编写一个连接到服务器、发送请求、读取响应以及发送其他命令的工具。
问题是服务器发送的响应在行数方面可能会有所不同(它总是至少一行,但可以是 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);