在Linux中,将大量数据转储到域套接字中没有问题,但是在大约65条logging之后,OS X 10.6.2上的相同代码就会出现。 套接字阅读器代码看起来像
#!/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(或者可能的负面影响可能是什么)。
这段代码真的不是很好的代码。 它尽可能快地发送数据包,并且将耗尽缓冲区空间。 我不知道为什么Linux没有,但这是一个古怪的东西,而不是依靠。
增加缓冲区空间不会有帮助,它只会隐藏错误的代码。
你可以试试
sysctl -w kern.ipc.maxsockbuf=8000000 sysctl -w net.inet.tcp.sendspace=4000000 sysctl -w net.inet.tcp.recvspace=4000000
但我会听从Michael Graff的build议,应该在应用程序代码中包含一些退避和重试逻辑