如何增加 OS X 10.6 中域套接字的缓冲区大小

如何增加 OS X 10.6 中域套接字的缓冲区大小

在 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 的建议,你应该在应用程序代码中包含一些退避和重试逻辑

相关内容