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