Назад | Перейти на главную страницу

Как увеличить размер буфера для сокетов домена в 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 (или какие могут быть возможные негативные побочные эффекты).

Можешь попробовать

sysctl -w kern.ipc.maxsockbuf=8000000
sysctl -w net.inet.tcp.sendspace=4000000
sysctl -w net.inet.tcp.recvspace=4000000

но я бы прислушался к предложению Майкла Граффа о том, что вы должны включить в код приложения некоторую логику отсрочки и повтора.

Этот код действительно плохой. Он отправляет пакеты так быстро, как только может, и у него заканчивается буферное пространство. Я не знаю, почему Linux этого не делает, но это странность, не на что полагаться.

Увеличение буферного пространства не поможет, оно просто скроет плохой код.