免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1586 | 回复: 2
打印 上一主题 下一主题

关于perl socket 中发送和接收缓冲区大小的问题,求大神帮助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-30 01:38 |只看该作者 |倒序浏览
本帖最后由 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才会出现阻塞,疯掉了,求解

论坛徽章:
0
2 [报告]
发表于 2013-06-30 08:22 |只看该作者
本帖最后由 dajun 于 2013-06-30 08:22 编辑

阻就阻呗, 管他干啥, 而且那个"自由空间"也不是固定的吧

论坛徽章:
0
3 [报告]
发表于 2013-07-01 23:25 |只看该作者
@兰花仙子 求帮助
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP