4

使用feoffgets脚本将继续运行,直到 1 分钟最大执行标记。

my $socket = new IO::Socket::INET(
    LocalPort => '5000',
    Proto     => 'tcp',
    Listen    => 5,
    ReuseAddr => 1,
);

my $connection = $socket->accept();

$connection->send("\0"); # makes PHP send the contents

my $data = <$connection>;
if($data != "1234") {
    $connection->send("not accepted");
} else {
    $connection->send("accepted");
}

$connection->close();

PHP在 60 秒过后才会发送内容使用时,它将几乎立即fread传递数据(但只会返回)。\0

$socket = fsockopen('tcp://192.168.56.101', 5000); // virtualbox IP
fwrite($socket, '1234');

echo fread($socket, 128);

fclose($socket);

上面的脚本几乎会立即执行,但只会 get \0

while(!feof($socket)) {
    echo fread($socket, 128);
}

在执行 60 秒之前,使用上述脚本不会发送任何数据。

问题

如何在没有 60 秒执行超时的情况下让 PHP 发送数据并从 perl 套接字检索所有数据?

4

1 回答 1

2

PHP 实际上是立即发送数据;问题是 Perl 没有用它做任何事情。如果你这样做:

my $data = <$connection>;
print $data; #add this line
if($data != "1234") { ....

然后用 Ctrl-C 杀死 PHP 脚本(Windows - 如果你使用 Linux,不知道命令是什么),Perl 脚本将立即输出“1234”。它挂在尖括号运算符上,因为那是一个读取行(即它正在寻找一个换行符并且永远找不到一个)。以下任一项使您的代码为我工作:

//in the PHP file
fwrite($socket, "1234\r\n");

或者

#in the Perl file (instead of my $data = <$connection>)
my $data;
$connection->recv($data, 1024);

编辑:在实施更改之前请参阅下面的评论。正如霍布​​斯所提到的,recv 可能不是最好的选择,尽管它碰巧可以工作,因为它不是在寻找换行符并且输入很短。以某种容量发送换行符(第一个建议的变体)可能是更好的选择。

于 2013-09-01T04:44:45.540 回答