#!/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;