免费注册 查看新帖 |

Chinaunix

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

Perl Socket 问题请教!--版主请! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-21 17:22 |只看该作者 |倒序浏览
各位好.
我写了一个小socket的server端.工作机制很简单,就是遍历文件,然后如果标志文件存在就生成一个session_id.这个session_id是system 调用系统命令.生成一个8位的随即字符串.

在socket部分,将变量$session_id 用send函数传送给client端.
可是client端无法获得该值.

我调试和判断后认为,应该是在$session_id 在语句体中的变量类型有问题,应该加上my. 但是,还是不行.
如果将send 的内容改为:
print CLIENT "hello world!\n";
send(CLIENT,$flag,0);

或者
print SESSION (my $s = localtime);  #直接调一个系统函数;

client端都是可以接收到值的.

因为本人是perl初学者,对于perl细节问题理解的不是很透彻.尤其是对于局部变量这块.
麻烦各位高手多多指教!代码如下:


============================
#!/usr/bin/perl
#LastUpdated:2006-06-21
#Server end

##use strict;
use warnings;

use IO::Handle;            
use Socket;   

#File define;
$prefix="/opt/modules/kdn/etc/";
$pds_filename="pds_channel_list.txt";
$server_config_file= $prefix.$pds_filename;
$flag_file=".ht_file";
$changename=".ht_file.old";
my $syn_start=0;

#Socket define;
$port=6880;               
$address=sockaddr_in($port,INADDR_ANY);  
socket(SERVER,AF_INET,SOCK_STREAM,getprotobyname('tcp'));  
bind(SERVER,$address);         
listen(SERVER,10);


#Become a Daemon
my $pid = fork();
print $pid,"\n";

if($pid) {
  #end parent process
  print "#parent process\n";
  exit(0);
}else {
  print "#child process";
}

# set new process group
setpgrp;

#Loop ;
while(1) {
  sleep(30);
  #Open file and read erveryline;
        open( OPF, $server_config_file)||die "Cannt open File: $server_config_file\n";
        @content = <OPF>;
        close (OPF);
       
        foreach $line (@content){
                 next if ($line =~ /^\s+/ || $line =~ /^#*$/);
          
           @str = (split( /,/, $line));
           $codename = $str[0];
           $filepath = $str[1];
           #print ("$codename\n$filepath\n$server_config_file\n");
           $flag_all = $filepath.$flag_file;
          
          
           if (-e $flag_all){
              $syn_start = 1;
             my $flag = $syn_start;
              if ($syn_start == 1){
                      print ("syn_start flag: $syn_start\n");
                      $sessionid = system 'date +%N | md5sum | head -c 8';
                      #print ("$sessionid\n");
                      ## example:rename(/opt/data/.ht_file,/opt/data/.ht_file.old);
                      #rename("$flag_all","$filepath/$changename");                     
              }
           }else {
              warn "$flag_all doesnt exist\n";
              }
        }
   
  open ("TEST",">>/tmp/test.log");
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
  $year+=1900;$mon++;
  print TEST ("INFO:$year-$mon-$mday $hour:$min:$sec.running is OK!\n");
  close (TEST);
  
next unless (accept(CLIENT,SERVER));
CLIENT->autoflush(1);
print CLIENT "$flag\n";
send(CLIENT,$flag,0);
close CLIENT;}
close SERVER;
=====================================


#!/usr/bin/perl -w
#LastUpdated:2006-06-16
#client end

##use strict;
use warnings;


use IO::Handle;            
use Socket;               
$port=6880;                 
$host='localhost';         
$packhost=inet_aton($host);     
$address=sockaddr_in($port,$packhost);


while(1) {
  sleep(10);
        socket(CLIENT,AF_INET,SOCK_STREAM,6);
        connect(CLIENT,$address);         
        CLIENT->autoflush(1);                    
        recv(CLIENT,$sessionid,length($sessionid),0);
        $sessionid=<CLIENT>;
        print "RECV:$sessionid\n";         
        close CLIENT;            
}

论坛徽章:
0
2 [报告]
发表于 2006-06-22 09:04 |只看该作者
UP

论坛徽章:
0
3 [报告]
发表于 2006-06-22 15:37 |只看该作者
哈哈,看不懂程序,但是我知道局部变量是用my声明的,全局变量用our,临时变量用local声明。
所以最好编程的时候use strict

论坛徽章:
0
4 [报告]
发表于 2006-06-23 09:56 |只看该作者
up

论坛徽章:
0
5 [报告]
发表于 2006-06-26 09:31 |只看该作者
我的天啊!Perl这个版是怎么了?我的这个问题不是很难啊.
麻烦就在这 ->   $sessionid = system 'date +%N | md5sum | head -c 8';
如果实在没人能帮助解决.那我就用rand(100);生成随即数了.这样省了一个变量定义.

论坛徽章:
0
6 [报告]
发表于 2006-06-26 13:20 |只看该作者
大家的问题太无聊 高手都不愿意理了
充分利用google和书籍吧

论坛徽章:
0
7 [报告]
发表于 2006-06-27 11:52 |只看该作者

  1. while(1) {
  2.   sleep(10);
  3.         socket(CLIENT,AF_INET,SOCK_STREAM,6);
  4.         connect(CLIENT,$address);         
  5.         CLIENT->autoflush(1);                    
  6.         [color=Red]recv(CLIENT,$sessionid,length($sessionid),0); [/color]
  7.         $sessionid=<CLIENT>;
  8.         print "RECV:$sessionid\n";         
  9.         close CLIENT;            
  10. }
复制代码

这里的$sessionid还没取到,就用length不对吧

论坛徽章:
0
8 [报告]
发表于 2006-06-27 16:36 |只看该作者
server端:
print CLIENT "$flag\n";
send(CLIENT,$flag,0);
这有个问题,都没看出来??? send和print重了.

论坛徽章:
0
9 [报告]
发表于 2006-06-27 16:44 |只看该作者
TO : 5楼aaronvox .
socket 问题无聊么?
这个问题符合<提问的智慧>所定义的要求.
代码是我自己写的.
我在提问前查过相关知识,并自己独立思考过.
我自己debug过.并确定了问题大致的范围.

作为版主有义务回答!至少他们可以说不知道.当然,没有回帖,也可以被默认为不知道.或者是没有尽职尽责.
我记得2周前我帖错了一个帖子的,标题为"code",在5分钟内,帖子就被删除,并给我发了站内消息.
有如此权限的人,为什么就不能为perl学习者提供些帮助呢?
现在是提问的第六天!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP