免费注册 查看新帖 |

Chinaunix

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

我的第一个网络小程序,但卡壳了,请帮忙看看错在哪里? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-06-02 14:51 |只看该作者 |倒序浏览
程序能够正常运行但不能够达到预期的目的,即如果两者的最后修改日期不同,就把服务端的文件传送到客户端。

server.pl

  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Socket;
  4. use constant PORT=>;"7986";

  5. my $protocol=getprotobyname('tcp');

  6. $SIG{'INT'}=sub{close SOCK;exit 0;};

  7. socket(SOCK,AF_INET,SOCK_STREAM,$protocol) or die "SOCKET fail:$!\n";#建立SOCKET套接字

  8. setsockopt(SOCK,SOL_SOCKET,SO_REUSEADDR,1) or die "Can't set SO_REUSEADDR:$!\n";
  9. #设置服务器的IP地址可重复使用#

  10. my $addr=sockaddr_in(PORT,INADDR_ANY);#生成套接字地址

  11. bind(SOCK,$addr) or die "bind() fail:$!\n";#绑定地址
  12. listen(SOCK,SOMAXCONN);#监听端口

  13. warn "Waitting for incoming connect on port PORT......\n";

  14. while(1)
  15. {
  16. next unless accept(SESSION,SOCK);#如果没有连接,进行下一循环
  17. my $md_time=<SESSION>;;
  18. if($md_time=~/time:/)
  19. {
  20. print SESSION "sending";
  21. my $time=(stat("data.txt"))[9];#得到此文件的最后修改日期
  22. last if($_ eq $time);#如果两者最后修改时间相同则退出
  23. open(FILE,"data.txt") or die "open file error:$!\n";
  24. foreach my $line (<FILE>;)
  25. {
  26. chomp $line;
  27. print SESSION $line;
  28. }
  29. close FILE;
  30. }
  31. }
  32. close SOCK;
复制代码

client.pl

  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Socket;
  4. use IO::Handle;

  5. my $ip=shift||"127.0.0.1";
  6. my $protocol=getprotobyname('tcp');
  7. my $port="7986";

  8. my $host=inet_aton($ip);

  9. my $sock_addr=sockaddr_in($port,$host);
  10. socket(SOCK,AF_INET,SOCK_STREAM,$protocol) or die "SOCK fail:$!\n";
  11. connect(SOCK,$sock_addr) or die "connect fail:$!\n";

  12. #warn "connecting......\n";

  13. SOCK->;autoflush();

  14. if(-e "newdata.txt")
  15. {
  16. print SOCK "time:"."(stat(\"data.txt\"))[9]";#把此文件的最后修改时间传送给服务端软件
  17. }
  18. else{
  19. print "no file";
  20. print SOCK "time:";
  21. }
  22. my $state=<SOCK>;
  23. chomp $state;
  24. if($state!~/sending/){exit 0;}

  25. warn "Reciving......";

  26. while(<SOCK>;)
  27. {
  28. open(FILE,">;data.txt") or die "open file fail:$!\n";
  29. chomp $_;
  30. print FILE "$_"."\n";
  31. }
  32. close FILE;
  33. close SOCK;     
复制代码

论坛徽章:
0
2 [报告]
发表于 2003-06-02 15:29 |只看该作者

我的第一个网络小程序,但卡壳了,请帮忙看看错在哪里?

<SESSION>;后面少了个";"

论坛徽章:
0
3 [报告]
发表于 2003-06-02 15:32 |只看该作者

我的第一个网络小程序,但卡壳了,请帮忙看看错在哪里?

还少了若干"}",
拜托下次帖仔细一点 :)

论坛徽章:
0
4 [报告]
发表于 2003-06-02 17:39 |只看该作者

我的第一个网络小程序,但卡壳了,请帮忙看看错在哪里?

不好意思,太急了,没有注意看。
    请问是什么原因产生的不能达到预期的效果。

论坛徽章:
0
5 [报告]
发表于 2003-06-02 18:09 |只看该作者

我的第一个网络小程序,但卡壳了,请帮忙看看错在哪里?

我改动了一下,你看看符不符合要求 :)
serv.pl

  1. #!/usr/bin/perl

  2. $| = 1;
  3. use strict;
  4. use Socket;
  5. use constant PORT=>;"7986";

  6. my $protocol=getprotobyname('tcp');

  7. $SIG{'INT'}=sub{close SOCK;exit 0;};
  8. socket(SOCK,AF_INET,SOCK_STREAM,$protocol) or die "SOCKET fail:$!\n";
  9. setsockopt(SOCK,SOL_SOCKET,SO_REUSEADDR,1) or die "Can't set SO_REUSEADDR:$!\n";
  10. my $addr=sockaddr_in(PORT,INADDR_ANY);

  11. bind(SOCK,$addr) or die "bind() fail:$!\n";
  12. listen(SOCK,SOMAXCONN);

  13. warn "Waitting for incoming connect on port PORT......\n";
  14. while(1)
  15. {
  16.         next unless accept(SESSION,SOCK);
  17.         print "accept : \n";
  18.         my $md_time=<SESSION>;;
  19.         print "$md_time\n";

  20.         if($md_time=~/time:/)
  21.         {
  22.                 print SESSION "sending";
  23.                 my $time=(stat("a"))[9];
  24.                 if($_ eq $time)
  25.                 {
  26.                         print "equal!\n";
  27.                         last;
  28.                 }
  29.                 open(FILE,"a") or die "open file error:$!\n";
  30.                 foreach my $line (<FILE>;)
  31.                 {
  32.                         chomp $line;
  33.                         print SESSION $line;
  34.                 }
  35.         }
  36. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2003-06-02 18:10 |只看该作者

我的第一个网络小程序,但卡壳了,请帮忙看看错在哪里?

client.pl
我把从SOCK接到的信息打印到屏幕上了,你看看正确否,然后把注释去掉就可以了;)

  1. #!/usr/bin/perl
  2. use strict;
  3. use Socket;
  4. use IO::Handle;

  5. $| = 1;
  6. my $ip=shift||"127.0.0.1";
  7. my $protocol=getprotobyname('tcp');
  8. my $port="7986";

  9. my $host=inet_aton($ip);
  10. my $sock_addr=sockaddr_in($port,$host);
  11. socket(SOCK,AF_INET,SOCK_STREAM,$protocol) or die "SOCK fail:$!\n";
  12. connect(SOCK,$sock_addr) or die "connect fail:$!\n";

  13. warn "connecting......\n";
  14. SOCK->;autoflush();

  15. if(-e "a")
  16. {
  17.         print SOCK "time:".(stat("a"))[9]."\n
  18. }
  19. else
  20. {
  21.         print "no file";exit 1;
  22.         print SOCK "time:";
  23. }

  24. print "Reciving : \n";
  25. while(<SOCK>;)
  26. {
  27.         exit 0 unless(/sending/);
  28.         #open(FILE,">;data.txt") or die "open file fail:$!\n";
  29.         #chomp $_;
  30.         print  "$_\n";
  31. }

  32. close FILE;
  33. close SOCK;

复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2003-06-02 19:36 |只看该作者

我的第一个网络小程序,但卡壳了,请帮忙看看错在哪里?

你這server有個缺點..一次只能處理一個client
如果同時處理多個client,要用fork去產生child process
....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP