- 论坛徽章:
- 0
|
本帖最后由 gknhjqx 于 2013-06-30 01:39 编辑
perl网络编程中说,syswrite在要写的字节数大于socket输出缓冲区自由空间大小时,也会产生阻塞,我想测试这个缓冲区的具体大小。
网上搜到的回答:
/proc/sys/net/ipv4/tcp_rmem:tcp接收缓冲区的min,default,max
/proc/sys/net/ipv4/tcp_wmem:tcp发送缓冲区的min,default,max
静态选择SO_SNDBUF和SO_RCVBUF则不受这两个值影响
我在测试机上的输出:
# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 4194304
# cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304
my $socket = IO::Socket::INET->new(PeerAddr=>'localhost',PeerPort=>'11110');
my $send = unpack("I",getsockopt($socket, SOL_SOCKET, SO_SNDBUF));
my $rcv = unpack("I",getsockopt($socket, SOL_SOCKET, SO_RCVBUF));
print "$send,$rcv\n";
输出结果:50652,87456
根据这两种结果,默认值应该是80K左右,于是我上具体代码测试:
客服端
my $data;
if (my $socket = IO::Socket::INET->new(PeerAddr=>'localhost',PeerPort=>'11110')) {
print "success\n";
sysread($socket,$data,1);
print "$data\n";
sleep 100;
}
服务器端
my $test = "a" x 200000;
my $socket = IO::Socket::INET->new(Listen=>20,LocalPort=>11110);
while (1) {
if (my $session = $socket->accept) {
#$session->blocking(0);
print "success\n";
syswrite($session, $test); #$test变量的大小超出输出缓存,有阻句柄会引起阻塞
}
print "next\n";
sleep 1;
}
发现服务器端的$test变量要设置大概为200K,syswrite才会出现阻塞,疯掉了,求解 |
|