Як збільшити розмір буфера для сокетів домену в OS X 10.6


2

У 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 (або які можливі негативні побічні ефекти можуть бути).

Відповіді:


2

Цей код насправді не гарний код. Він надсилає пакети якнайшвидше, і у ньому не вистачить місця в буфері. Я не знаю, чому Linux не робить, але це дивацтво, а не те, на що можна покластися.

Збільшення буферного простору не допоможе, воно просто приховає поганий код.


Не знаючи, що таке розмір буфера, як я можу знати, коли потрібно відмовитися? Якщо я використовую розетки INET, він працює чудово в ОС X.
Chas. Оуенс

2

Ви можете спробувати

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

але я б прислухався до пропозиції Майкла Граффа про те, що ви повинні включити у свою заявку код логіки backoff та повторити спробу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.