首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无限限幅回路

无限限幅回路
EN

Stack Overflow用户
提问于 2013-08-31 12:51:28
回答 1查看 773关注 0票数 4

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

代码语言:javascript
运行
复制
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();

在60秒过去之前,不会发送,而不会发送内容。当使用fread时,它将几乎立即传递数据(但只会得到\0 )。

代码语言:javascript
运行
复制
$socket = fsockopen('tcp://192.168.56.101', 5000); // virtualbox IP
fwrite($socket, '1234');

echo fread($socket, 128);

fclose($socket);

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

代码语言:javascript
运行
复制
while(!feof($socket)) {
    echo fread($socket, 128);
}

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

问题

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-01 04:44:45

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

代码语言:javascript
运行
复制
my $data = <$connection>;
print $data; #add this line
if($data != "1234") { ....

然后用Ctrl-C (Windows --不知道命令是什么,如果您使用Linux)关闭PHP脚本,Perl脚本将立即输出"1234“。它挂在角括号操作符上,因为这是一个读行(也就是说,它在寻找换行符,却永远找不到)。下列任一项都让您的代码为我工作:

代码语言:javascript
运行
复制
//in the PHP file
fwrite($socket, "1234\r\n");

代码语言:javascript
运行
复制
#in the Perl file (instead of my $data = <$connection>)
my $data;
$connection->recv($data, 1024);

编辑:在实现更改之前,可以看到下面的注释。正如霍布斯所提到的,recv可能不是最好的选择,尽管它碰巧起作用了,因为它没有寻找换行符,而且输入很短。以某种容量发送换行符(第一个建议的变体)可能是更好的选择。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18548342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档