阻塞的Socket链接

 #!/usr/bin/perl -w
# socket_cli.plx
# usage
# socket_cli.plx 同一个文件重复运行次数 发送socket包存放的文件 [从文件第几行开始运行]
use strict;
use IO::Socket;
use Benchmark;

my $addr = '127.0.0.1';
my $port = '40169';

my $for_num = $ARGV[0] || die "请输入需要循环的次数!/n";
my $f_name = $ARGV[1] || die "请数据读入的文件!/n";
my $next_line = $ARGV[2] || '0'; #从文件第几行开始运行

my($rbuf,$succ_bytes,$recv_bytes,$systime,$time_out,$socket);
my($timesamp1,$timesamp2,$time_run,$file_line,$log_file);

#日志文件
#$log_file="./socket_long_".$f_name."log";
$log_file="/dev/null";
open (FILELOG,">>$log_file") || "open file err! $!";

$time_out = 5;
$SIG{ALRM} = sub {die "timeout"};

for (my $i=1;$i<=$for_num;$i++){
 print FILELOG "执行第$i次循环(共需执行循环 $for_num 次)/n";
 open (FILENAME,$f_name) || "open file err! $!";
 $file_line=0;
 
  #建立socket链接
 $socket = IO::Socket::INET->new(PeerAddr => $addr, PeerPort => $port, Proto => "tcp", Type => SOCK_STREAM)
   or die "链接socket端口出错! $!/n";
 
 while (<FILENAME>) {
  if ( $file_line < $next_line ){
   $file_line++;
   next;
  }
  chomp $_;
  $systime = `date '+%Y%m%d %H:%M:%S'`;
  chomp $systime;
  
  print FILELOG "=======================$systime=========================================/n";
  print FILELOG "执行第 $i 次循环(共需执行循环 $for_num 次)/n";
  print FILELOG "发送数据包:/n$_"."/n";
  #print FILELOG $socket "$_";
  
  eval{
   alarm($time_out);
   $timesamp1 = new Benchmark;
  
   #发送包
   $succ_bytes=$socket->send("$_") || die "send date err! $!";
  
   #接收包
   #$socket->recv($rbuf,5000) || die "没有收到返回消息! $!/n";
   $rbuf=<$socket> || die "没有收到返回消息! $!/n";
   $timesamp2 = new Benchmark;
   alarm(0);
  };

  if($@ =~ /timeout/){
   print FILELOG "socket timeout! $time_out/n";
  }else{
   $recv_bytes=length($rbuf);
   print FILELOG "/接收到数据包:/n$rbuf/n"."发送的数据包长度:$succ_bytes/n"."接收的数据包长度:$recv_bytes/n";
  }
  #打印CPU占用时间
  $time_run = Benchmark::timediff($timesamp2, $timesamp1);
  $time_run = Benchmark::timestr($time_run);
  $time_run =~ /(/d+)/s*wallclock secs /(/s*?(/d*?/./d*?)/s*usr/s*/+/s*(/d*?/./d*?)/s*sys/i;
  my $alltimas=($2+$3)*1000;
  print FILELOG "程序占用 CPU 时间: usr + sys 合计运行时间 $alltimas 毫秒/n";
  
  if ($alltimas >= 100){
   print FILELOG "!!!时间较长的业务有:".substr($_,28,12)." 运行时间:$alltimas/n";
  }
  

  $file_line++;
  print FILELOG "已经处理 $f_name 的 $file_line 行记录/n"
 }
 close $socket;
 
 close FILENAME;
 $systime = `date '+%Y%m%d %H:%M:%S'`;
 print FILELOG "已经处理文件$i次循环完毕:".$systime."/n"
}

close FILELOG;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值