perl 套接字事件驱动编程

Posted

技术标签:

【中文标题】perl 套接字事件驱动编程【英文标题】:perl socket event driven programming 【发布时间】:2017-09-27 17:08:30 【问题描述】:

我正在编写一个 perl 服务器,它使用公钥和私钥对客户端进行身份验证,最终我需要 $client_socket->recv 是事件驱动的,而不是无限循环的轮询。是否有内置代码来执行由 IO::Socket::INET 驱动的事件。

while(1)

    # waiting for a new client connection
    my $client_socket = $socket->accept();

    # get information about a newly connected client
    my $client_address = $client_socket->peerhost();
    my $client_port = $client_socket->peerport();
    print "connection from $client_address:$client_port\n";

    # read up to 1024 characters from the connected client
    my $data = "";
    $client_socket->recv($data, 1024);
    print "received data: $data\n";

    # write response data to the connected client
    $client_socket->send("some response text");

    # notify client that response has been sent
    shutdown($client_socket, 1);

【问题讨论】:

【参考方案1】:

没有。

Perl 没有内置任何用于事件驱动编程的东西。有各种模块可以在 CPAN 上进行事件驱动开发。其中一些列在Task::Kensho::Async。

最著名的是POE 和AnyEvent。但您可能想专门查看IO::Async。

【讨论】:

我没有在此处包含示例,因为我从未真正使用过其中任何一个,现在也没有时间尝试。 所以你是否建议我应该依靠轮询数据以及如何处理新的传入连接,因为可能有我自己定义的与客户端的握手次数。这是稳健的做法吗?我不想以 nodejs 告终。 @Sagar 不,simbabque 建议您使用上述模块之一来提供事件循环。 (也就是说,perl 有内置的工具来构建事件循环,主要是select。) 这个来自 AnyEvent 的列表比较全面:“AnyEvent - 事件循环编程的 DBI。EV, Event, Glib, Tk, UV, Perl, Event::Lib, Irssi, rxvt-unicode, IO ::Async、Qt、FLTK 和 POE 是各种受支持的事件循环/环境。” 是的,我不太同意这种描述。 AnyEvent 与 DBI 完全不同。我不会使用 AnyEvent(事实上,我会避免使用这个特定作者的所有模块)。

以上是关于perl 套接字事件驱动编程的主要内容,如果未能解决你的问题,请参考以下文章

事件驱动编程

事件驱动

反应式编程与事件驱动编程有何不同?

Python并发编程-事件驱动模型

Python并发编程-事件驱动模型

事件驱动编程模式下C代码啥时候中断?