1 | #!/opt/perl/bin/perl |
1 | #!/opt/perl/bin/perl |
2 | use strict; |
2 | use strict; |
3 | use Socket; |
3 | use Socket; |
4 | use IO::Socket::INET; |
4 | use IO::Socket::INET; |
5 | use AnyEvent::Util; |
5 | use AnyEvent::Socket; |
6 | use AnyEvent::Handle; |
6 | use AnyEvent::Handle; |
7 | |
7 | |
8 | my $cv = AnyEvent->condvar; |
8 | my $cv = AnyEvent->condvar; |
9 | |
9 | |
10 | my $sock = IO::Socket::INET->new ( |
|
|
11 | Listen => 5, ReuseAddr => 1, LocalPort => 124, |
|
|
12 | ) or die "Couldn't make socket: $!\n"; |
|
|
13 | |
|
|
14 | print "Listening on addres: " . $sock->sockhost . ", port: " . $sock->sockport . "\n"; |
|
|
15 | |
|
|
16 | my $hdl; |
10 | my $hdl; |
17 | |
11 | |
18 | my $watchobj = AnyEvent::Util::listen ($sock, sub { |
12 | warn "listening on port 34832...\n"; |
|
|
13 | |
|
|
14 | AnyEvent::Socket::tcp_server undef, 34832, sub { |
19 | my ($clsock, $paddr) = @_; |
15 | my ($clsock, $host, $port) = @_; |
20 | my ($port, $addr) = sockaddr_in ($paddr); |
|
|
21 | $addr = inet_ntoa ($addr); |
|
|
22 | print "Got new client connection: $addr:$port\n"; |
16 | print "Got new client connection: $host:$port\n"; |
23 | |
17 | |
24 | $hdl = |
18 | $hdl = |
25 | AnyEvent::Handle->new ( |
19 | AnyEvent::Handle->new ( |
26 | fh => $clsock, |
20 | fh => $clsock, |
27 | on_eof => sub { print "client connection $addr:$port: eof\n" }, |
21 | on_eof => sub { print "client connection $host:$port: eof\n" }, |
28 | on_error => sub { print "Client connection error: $addr:$port: $!\n" } |
22 | on_error => sub { print "Client connection error: $host:$port: $!\n" } |
29 | ); |
23 | ); |
30 | |
24 | |
31 | $hdl->push_write ("Hello!\015\012"); |
25 | $hdl->push_write ("Hello!\015\012"); |
32 | |
26 | |
33 | $hdl->push_read_line (sub { |
27 | $hdl->push_read_line (sub { |
34 | my (undef, $line) = @_; |
28 | my (undef, $line) = @_; |
35 | print "Yay, got line: $line\n"; |
29 | print "Yay, got line: $line\n"; |
36 | $hdl->push_write ("Bye\015\012"); |
30 | $hdl->push_write ("Bye\015\012"); |
37 | $hdl->on_drain (sub { $hdl->fh->close; undef $hdl }); |
31 | $hdl->on_drain (sub { $hdl->fh->close; undef $hdl }); |
38 | }); |
32 | }); |
39 | |
33 | }; |
40 | }, sub { |
|
|
41 | warn "Got error on connect: $!\n"; |
|
|
42 | $cv->broadcast; |
|
|
43 | }, 10); |
|
|
44 | |
34 | |
45 | $cv->wait; |
35 | $cv->wait; |