gpt4 book ai didi

Perl IO::Socket 计时问题

转载 作者:行者123 更新时间:2023-12-03 12:01:41 25 4
gpt4 key购买 nike

我遇到了一个奇怪的问题。我在 Perl 中编写了一个小守护进程,它绑定(bind)了服务器上的端口。
在同一台服务器上,有一个 LAMP 正在运行,我的 Perl 守护程序的客户端是一个 php 文件,它使用守护程序打开一个套接字,推送一些信息,然后关闭连接。在 Perl 守护程序中,我将每个连接记录在一个日志文件中以供以后使用。

我最大的问题是:在 php 脚本完成执行的那一刻之间,有 15-20 秒的时间,直到守护进程记录连接。

PHP客户端:

$sh = fsockopen("127.0.0.1", 7890, $errno, $errstr, 30);
if (!$sh)
{
echo "$errstr ($errno)<br />\n";
}
else
{

$out = base64_encode('contents');
fwrite($sh, $out);
fclose($sh);
}

Perl 守护进程(只是套接字部分)
#!/usr/bin/perl

use strict;
use warnings;
use Proc::Daemon;
use Proc::PID::File;
use IO::Socket;
use MIME::Base64;
use Net::Address::IP::Local;

MAIN:
{
#setup some vars to be used down...
if (Proc::PID::File->running())
{
exit(0);
}


my $sock = new IO::Socket::INET(
LocalHost => $ip,
LocalPort => $port,
Proto => 'tcp',
Listen => SOMAXCONN,
Reuse => 1);

$sock or die "no socket :$!";
my($new_sock, $c_addr, $buf);

for (;;)
{

# setup log file
open(LH, ">>".$logs);

print "SERVER started on $ip:$port \n";
print LH "SERVER started on $ip:$port \n";

while (($new_sock, $c_addr) = $sock->accept())
{
my ($client_port, $c_ip) =sockaddr_in($c_addr);
my $client_ipnum = inet_ntoa($c_ip);
my $client_host =gethostbyaddr($c_ip, AF_INET);

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime time;
$year += 1900;
$mon += 1;
print "$year-$mon-$mday $hour:$min:$sec [".time()."] - got a connection from: [$client_ipnum]";

open(AL, ">>".$accessLog);
print AL "$year-$mon-$mday $hour:$min:$sec [".time()."] - got a connection from: [$client_ipnum]\n";
close AL;

while (defined ($buf = <$new_sock>))
{
print "contents:", decode_base64($buf), " \n";
open(FH, ">".$basepath."file_" . time() .".txt") or warn "Can't open ".$basepath."file_".time().".txt for writing: $!";
print FH decode_base64($buf);
close FH;
}
}
close LH;

}

}

我做错了什么,然后导致php在编写套接字后关闭套接字和记录连接的Perl脚本之间有20秒的差距。任何的想法?
温柔点,我是 Perl 新手 :)

最佳答案

$new_sock 没有明确关闭,因此在接受调用之前不会关闭。这可能会导致一些事情挂起,直到超时。 (我不确定是否会在进入接受或退出时发生关闭。)

此外,您正在使用“<>”运算符从套接字读取数据。如果输入中没有换行符会发生什么?

查看实际情况的最佳方法是在“strace -e trace=network”下运行该进程,并尝试将网络系统调用与 perl 和 php 语句相匹配。

关于Perl IO::Socket 计时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2356903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com