在 Linux 中,将大量数据转储到域套接字中没有问题,但 OS X 10.6.2 上的相同代码在大约 65 条记录后爆炸。套接字阅读器代码看起来像
#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket;
unlink "foo";
my $sock = IO::Socket::UNIX->new (
Local => 'foo',
Type => SOCK_DGRAM,
Timeout => 600,
) or die "Could not create socket: $!\n";
while (<$sock>) {
chomp;
print "[$_]\n";
}
客户端代码看起来像
#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket;
my $sock = IO::Socket::UNIX->new (
Peer => 'foo',
Type => SOCK_DGRAM,
Timeout => 600,
) or die "Could not create socket: $!\n";
for my $i (1 .. 1_000_000) {
print $sock "$i\n" or die $!;
}
close $sock;
我得到的错误信息是No buffer space available at write.pl line 15.
. Linux 和 OS X 之间的缓冲区大小存在差异似乎相当明显,但我不知道如何设置它 OS X(或可能的负面影响可能是什么)。
这段代码真的不是很好的代码。它尽可能快地发送数据包,但缓冲区空间不足。我不知道为什么 linux 不这样做,但这是一个奇怪的东西,不是可以依赖的东西。
增加缓冲区空间无济于事,它只会隐藏坏代码。
你可以试试
但我会听从 Michael Graff 的建议,即您应该在应用程序代码中包含一些退避和重试逻辑