Perl套接字(IO :: Socket :: INET6)不是自动刷新

时间:2018-02-12 08:53:55

标签: perl sockets flush inet autoflush

我有一个非常奇怪的场景。 我有一个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();
}

程序在最初的几分钟内工作正常但是 - 由于某种原因,autoflush停止工作并且套接字开始缓冲。套接字开始发送大约1500字节的块。

目前似乎有帮助的是手动调用flush函数(请参阅注释内联)。 任何人都可以解释为什么autoflush几分钟后突然停止工作? 是否手动调用以刷新有效且唯一的解决方案?

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

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

1 个答案:

答案 0 :(得分:0)

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

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

如果autoflush无法执行,则手动调用flush将发送消息。

我将打开CPAN IO组的票证