Como aumentar o tamanho do buffer para soquetes de domínio no OS X 10.6

2

No Linux, não tenho nenhum problema em descarregar toneladas de dados em um soquete de domínio, mas o mesmo código no OS X 10.6.2 explode após cerca de 65 registros. O código do leitor de sockets parece

#!/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";
}

E o código do cliente se parece com

#!/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;

A mensagem de erro que recebo é No buffer space available at write.pl line 15. . Parece bastante óbvio que há uma diferença no tamanho do buffer entre o Linux e o OS X, mas não sei como defini-lo como OS X (ou quais seriam os possíveis efeitos colaterais negativos).

    
por Chas. Owens 15.01.2010 / 01:31

2 respostas

2

Este código não é realmente um bom código. Ele envia pacotes o mais rápido possível e fica sem espaço no buffer. Eu não sei porque o linux não, mas isso é uma esquisitice, não algo em que confiar.

Aumentar o espaço do buffer não ajudará, apenas esconderá o código incorreto.

    
por 15.01.2010 / 02:27
2

Você pode tentar

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

mas eu prestaria atenção à sugestão de Michael Graff de que você deveria incluir alguma lógica de backoff e repetição no código do seu aplicativo

    
por 24.02.2010 / 11:04