Perl AnyEvent::Ping代码分析。

本文详细解析了一段使用协程实现TCP ping功能的代码,包括其核心模块`subtcp_ping_syn`和`subtcp_ping_ack`的运作原理及使用方法。面对协程复杂的逻辑和自定义返回值的特性,作者分享了如何理解和应用此类技术,旨在帮助开发者更好地掌握协程在实际场景中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

坑爹的Coro。。想要用协程比较坑爹,还要自己改写。瞬间就疯了。。

没办法的情况下,研究了下它的模块代码,具体如下:

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改写一个。。

转载于:https://www.cnblogs.com/xiaoCon/p/3360580.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值