sub tcp_ping_syn {
my $host = shift;
my $port = shift;
my $timeout = shift || 5;
if ((++$PingQueue{$host}{$port}{Requests}) > 1) {
# Ping already underway...
return;
}
my $cv = AnyEvent->condvar;
my $startTime;
my $endTime;
$PingQueue{$host}{$port}{CondVar} = $cv;
tcp_connect $host, $port, sub {
$endTime = time;
my ($fh) = @_;
$cv->send(( $fh ? (($endTime - $startTime) * 1000) : undef ));
},
sub {
$startTime = time;
$timeout;
};
return undef;
}
尼码。压根就没有返回值。。那它在干嘛呢。。。= = # 瞬间惊呆了。。
前面就是尼码的铺垫,对此没辙,还得继续折腾。看了下只有ACK才会有返回值。具体如下:
sub tcp_ping_ack {
my $host = shift;
my $port = shift;
if ($PingQueue{$host}{$port}{Requests} < 1) {
# No outstanding requests...
return undef;
}
my $latency = $PingQueue{$host}{$port}{CondVar}->recv;
if ((--$PingQueue{$host}{$port}{Requests}) < 1) {
# Responded to last request.
$PingQueue{$host}{$port}{CondVar} = undef;
}
return $latency;
}
但是怎么用还没折腾出来。。看PY怎么说。。貌似laputa73说可以自己再写个Coro::Ping...估计得用SOCKET改写一个。。