summaryrefslogtreecommitdiff
path: root/examples/whoami-server.pl
diff options
context:
space:
mode:
Diffstat (limited to 'examples/whoami-server.pl')
-rw-r--r--examples/whoami-server.pl58
1 files changed, 58 insertions, 0 deletions
diff --git a/examples/whoami-server.pl b/examples/whoami-server.pl
new file mode 100644
index 0000000..f11f8ea
--- /dev/null
+++ b/examples/whoami-server.pl
@@ -0,0 +1,58 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use IO::Async::Loop;
+use IO::Async::Stream;
+use IO::Async::Listener;
+
+my $PORT = 12345;
+
+my $loop = IO::Async::Loop->new;
+
+my $listener = IO::Async::Listener->new(
+ on_accept => sub {
+ my $self = shift;
+ my ( $socket ) = @_;
+
+ # $socket is just an IO::Socket reference
+ my $peeraddr = $socket->peerhost . ":" . $socket->peerport;
+
+ my $clientstream = IO::Async::Stream->new(
+ write_handle => $socket,
+ );
+
+ $loop->add( $clientstream );
+
+ $clientstream->write( "Your address is " . $peeraddr . "\n" );
+
+ $loop->resolver->getnameinfo(
+ addr => $socket->peername,
+
+ on_resolved => sub {
+ my ( $host, $service ) = @_;
+ $clientstream->write( "You are $host:$service\n" );
+ $clientstream->close_when_empty;
+ },
+ on_error => sub {
+ $clientstream->write( "Cannot resolve your address - $_[-1]\n" );
+ $clientstream->close_when_empty;
+ },
+ );
+ },
+);
+
+$loop->add( $listener );
+
+$listener->listen(
+ service => $PORT,
+ socktype => 'stream',
+)->on_done( sub {
+ my ( $listener ) = @_;
+ my $socket = $listener->read_handle;
+
+ printf STDERR "Listening on %s:%d\n", $socket->sockhost, $socket->sockport;
+})->get;
+
+$loop->run;