免费注册 查看新帖 |

Chinaunix

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

一个perl的奇怪输出问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-09 22:34 |只看该作者 |倒序浏览
5可用积分
现在我改了下程序了,不过发现接受数据有问题,为什么大的数据接收数据就会出错。。
这是代码:
my $port = shift || MY_SEG_PORT;   
    my $protocol= getprotobyname('tcp');
    socket(SOCK,AF_INET,SOCK_STREAM,$protocol)or die "socket() failed!";
    setsockopt(SOCK,SOL_SOCKET,SO_REUSEADDR,1) or die "can't set SO_REUSEDDR: $!";

    my $my_addr = sockaddr_in($port,INADDR_ANY);
    bind(SOCK,$my_addr) or die "bind() failed!";
    listen(SOCK,SOMAXCONN) or die "listen()failed: $!";
    
    warn "waiting for incoming connections on the segment $port...\n";

    while(1)
    {
        next unless my $remote_addr = accept(SESSION,SOCK,);
        my($port,$hisaddr) = sockaddr_in($remote_addr);
        warn "Connection from {",inet_ntoa($hisaddr),",$port}\n";
        SESSION->autoflush(1);
     
        my $lengthStr=0;
        my $data="";
        my $senData="";
        my %TF=();
        my $wordNum=0;
        my $readLength=2048;
        my $hasRead=0;
        
        sysread (SESSION,$lengthStr,4);#文本长度

        my $length=unpack('N',$lengthStr);
        
        warn $length."\n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while($hasRead<$length)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $tempLength=($hasRead+$readLength)<=$length?$readLength:($length-$hasRead);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sysread (SESSION,$data,$tempLength,$hasRead);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$hasRead+=$tempLength;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#read (SESSION,$data,$length,$hasRead);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;syswrite (STDOUT,$data,$length);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#print "aaaaaaaaaaa\n";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#print OU $data."\n";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#$data=decode('utf8',$data);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#$data=encode('cp936',$data);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bytes::length($data)!=$length)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die "transfer error!\n";            
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}


[ 本帖最后由 earl808 于 2008-9-10 18:49 编辑 ]

a.rar

5.37 KB, 下载次数: 14

里面有两个文件,分别是发送和接受的数据

论坛徽章:
0
2 [报告]
发表于 2008-09-09 22:44 |只看该作者
[code]
print OUT $senData;
[/code]
是向OUT这个文件句柄指向的文件些东西
一般的
print $data ;

print STDOUT $data;
是一样的
只不过把STDOUT省略了
还是好好看小骆驼吧
里面都有讲到

论坛徽章:
0
3 [报告]
发表于 2008-09-09 22:46 |只看该作者
ms我理解错误
还是具体贴代码吧
另外注意把autoflush打开

论坛徽章:
0
4 [报告]
发表于 2008-09-09 23:49 |只看该作者
是不是没有autoflush 且程序结束没有 close句柄啊

论坛徽章:
0
5 [报告]
发表于 2008-09-10 00:39 |只看该作者

回复 #4 socyno 的帖子

我都做了

论坛徽章:
0
6 [报告]
发表于 2008-09-10 06:36 |只看该作者
缓冲区太小?

论坛徽章:
0
7 [报告]
发表于 2008-09-10 08:56 |只看该作者

回复 #6 lujx 的帖子

怎么设缓冲区?
不过只是个小文本啊。。还没到m呢

论坛徽章:
0
8 [报告]
发表于 2008-09-10 09:47 |只看该作者
用syswrite就可以了

论坛徽章:
0
9 [报告]
发表于 2008-09-10 12:06 |只看该作者
是binmode的原因么? 把数据拿出来比较一下呀

论坛徽章:
0
10 [报告]
发表于 2008-09-10 17:24 |只看该作者
不过现在发现大文本还是传不完啊。。

我这个是个TCP/IP程序,怎么比较?

[ 本帖最后由 earl808 于 2008-9-10 17:52 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP