在 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 上设置它(或者可能产生哪些负面影响)。
答案1
这段代码确实不是好代码。它尽可能快地发送数据包,并且会耗尽缓冲区空间。我不知道为什么 Linux 不会这样做,但这是一个奇怪的现象,不是可以依赖的东西。
增加缓冲区空间不会有帮助,它只会隐藏坏代码。
答案2
你可以试试
sysctl -w kern.ipc.maxsockbuf=8000000
sysctl -w net.inet.tcp.sendspace=4000000
sysctl -w net.inet.tcp.recvspace=4000000
但我会听从 Michael Graff 的建议,你应该在应用程序代码中包含一些退避和重试逻辑