#! perl # mandatory # this listens for new tcp connections and hands them over to the server core # whether this being an extension introduces or reduces stability problems # is unknown as of today. use Socket; use AnyEvent::Socket; CONF BIND_ADDRESSES = [[undef, 13327]]; our $MAX_DETECT = 16; # how many bytes to raed to identify the protocol our @LISTENERS; for (@$BIND_ADDRESSES) { my ($host, $port) = @$_; cf::info "listening on ", (format_hostport $host, $port), "\n"; push @LISTENERS, tcp_server $host, $port, sub { my ($fh, $host, $port) = @_ or return; my $lhost = AnyEvent::Socket::format_address +(AnyEvent::Socket::unpack_sockaddr getsockname $fh)[1]; my $id = format_hostport $host, $port; cf::info "$id: new connection\n" if $lhost ne $host; # do not log connections from the host, e.g. for watchdogs my $buf; my $w; $w = AE::io $fh, 0, sub { my $len = sysread $fh, $buf, 512, length $buf; if ($len) { if ($buf =~ /^..version /s) { # deliantra protocol undef $w; my $ns = cf::client::create fileno $fh, $host; $ns->inbuf_append ($buf); } elsif ($buf =~ /^GET / && defined &ext::http::server) { # http or websocket undef $w; &ext::http::server ($id, $fh, $buf); } elsif (length $buf >= $MAX_DETECT) { # unable to detect protocol undef $w; cf::info "$id: protocol detection error\n"; } } else { undef $w; cf::info "$id: read error during protocol detection\n"; } }; }; }