1

我有一个非常奇怪的场景。我有一个 Perl 应用程序,它接收来自多个连接(套接字和管道)的输入。比我将消息转发到预定义的目的地(套接字已经打开)。

见代码示例:

our %openSockets;
sub forward_message{
    my ($message,$ip,$port,$proto) = @_;
    my $key = "$ip:$port:$proto";

    my $socket = $openSockets{$key};
    unless ($socket && $socket->connected()){
$|=1;#Setting autoflush
        $socket = new IO::Socket::INET6(
        PeerAddr => $ip,
        PeerPort => $port,
        Proto    => $proto
        ) || die "Can't create socket [$key]"; 
        $openSockets{$key} = $socket;
    }

    #autoflush $sock 1;
    $socket->say($message);
    #$socket->flush();
}

该程序在前几分钟运行良好,但由于某种原因自动刷新停止工作并且套接字开始缓冲。套接字开始发送约 1500 字节的块。

目前似乎有帮助的是手动调用flush函数(见内联注释)。谁能解释为什么几分钟后自动冲洗突然停止工作?是否手动调用以刷新有效且唯一的解决方案?

仅供参考 - 我在进程上运行 strace 并确保它是写入 ~1500 字节块的进程(这不是决定缓冲它的接口驱动程序)

更多信息(如果需要):平台:Linux Perl 版本:5.16 模块版本:2.69 (INET6) | 1.34(插座)

4

1 回答 1

0

我找到了解决方法。如果您使用 Perl-Threads,不确定它是否会按预期工作,但对于我的小型应用程序,它可以工作。

$socket->say($message);
$socket->flush();

如果自动刷新失败,手动调用刷新将发送消息。

我将在 CPAN IO 组开一张票

于 2018-02-14T08:13:27.777 回答