我有一个非常奇怪的场景。 我有一个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(插座)
答案 0 :(得分:0)
我找到了解决方法。 如果您使用的是Perl-Threads,不确定它是否会按预期工作,但对于我的小应用程序,它可以工作。
$socket->say($message);
$socket->flush();
如果autoflush无法执行,则手动调用flush将发送消息。
我将打开CPAN IO组的票证