В 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 этого не делает, но это странность, не на что полагаться.
Увеличение буферного пространства не поможет, оно просто скроет плохой код.