Re: Combining services.
Rocco Caputo <[email protected]> Wed, 30 Jan 2013 10:09:58 -0500
| Newsgroups | gmane.comp.lang.perl.poe |
|---|---|
| Message-ID | <[email protected]> |
--Apple-Mail-11--1000690653 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii On Jan 30, 2013, at 09:49, Antti Linno wrote: >=20 > Or I need advice, how to merge several sungo's( > http://poe.perl.org/?POE_Cookbook/TCP_Servers) daemons into one = package, if > someone would be so kind. Adding UDP should be fairly similar then. > Any hints, second opinion(maybe not to merge TCP and UDP), or code = examples > are welcome :) I've attached a working version of your sample code. It starts two TCP = servers and a UDP service, and lets them all run at once in the same = process. --=20 Rocco Caputo <[email protected]> --Apple-Mail-11--1000690653 Content-Disposition: attachment; filename=antti-linno-combined-services.pl Content-Type: text/x-perl-script; name="antti-linno-combined-services.pl" Content-Transfer-Encoding: 7bit #!/usr/bin/env perl use warnings; use strict; use Socket qw(unpack_sockaddr_in inet_ntoa); use POE qw(Component::Server::TCP); sub setup_tcp_server { my ($port, $alias) = @_; POE::Component::Server::TCP->new( Alias => $alias, Port => $port, ClientInput => sub { my ($session, $heap, $input) = @_[SESSION, HEAP, ARG0]; print "Server [$alias] Session ", $session->ID(), " got input: $input\n"; $heap->{client}->put($input); } ); } sub setup_udp_service { my ($port, $alias) = @_; POE::Session->create( inline_states => { _start => sub { my $socket = IO::Socket::INET->new( Proto => 'udp', LocalPort => $port, ); die "Couldn't create server socket: $!" unless $socket; $_[KERNEL]->select_read($socket, "get_datagram"); $_[KERNEL]->alias_set($alias); }, get_datagram => sub { my ($kernel, $socket) = @_[KERNEL, ARG0]; my $remote_address = recv($socket, my $message = "", 65536, 0); return unless defined $remote_address; my ($peer_port, $peer_addr) = unpack_sockaddr_in($remote_address); my $human_addr = inet_ntoa($peer_addr); print "(server) $human_addr : $peer_port sent us $message\n"; $message =~ tr[a-zA-Z][n-za-mN-ZA-M]; send($socket, $message, 0, $remote_address) == length($message) or warn "Trouble sending response: $!"; }, } ); } setup_tcp_server(11211, "tcp_server_one"); setup_tcp_server(11212, "tcp_server_two"); setup_udp_service(8675, "udp_service_three"); # The imporant part is not to start things until they are set up. # run() will run the event loop until all work is done. In this case, # until all previously setup services shut down---"forever" in the # example. POE::Kernel->run(); exit; --Apple-Mail-11--1000690653 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii --Apple-Mail-11--1000690653--