#!/usr/bin/env perl use strict; use warnings; use AnyEvent; use AnyEvent::Log; use AnyEvent::Handle; use AnyEvent::Socket; use EV; use Data::Dumper; $AnyEvent::Log::FILTER->level ("trace"); my $handle; my @queue; tcp_connect "127.0.0.1", 9999, sub { my ($fh) = @_; print "Before push_write\n"; push (@queue, "XX\n"); push (@queue, "YY\n"); push (@queue, "ZZ\n"); print "After push_write\n"; $handle = new AnyEvent::Handle ( fh => $fh, tls => "connect", tls_ctx => { verify => 0 }, on_error => sub { my ($xhandle, $fatal, $message) = @_; print "on_error: ($xhandle) ($fatal) ($message)\n"; exit 1; }, on_eof => sub { my ($handle) = @_; print "on_eof:\n"; exit 0; }, on_drain => sub { my ($handle) = @_; print "on_drain:\n"; if (@queue) { my $write = shift @queue; print "Write :$write"; $handle->push_write ($write); } else { print "Queue is empty\n"; $handle->push_shutdown (); } }, on_starttls => sub { my ($handle, $success, $error) = @_; print "on_starttls ($success) ($error)\n"; return; } ); }; EV::run; #### tcp_server undef, $port, sub { my ($fh) = @_; my $handle = new AnyEvent::Handle fh => $fh, tls => "accept", tls_ctx => { cert_file => "my-server-keycert.pem" }, ... #### #!/usr/bin/env perl use strict; use warnings; use Data::Dumper; use AnyEvent; use AnyEvent::Handle; use AnyEvent::Socket; use AnyEvent::Log; use IO::Socket::SSL; use EV; use Cpanel::JSON::XS; use Path::Tiny qw(path); $IO::Socket::SSL::DEBUG = 3; $AnyEvent::Log::FILTER->level ("trace"); my $json_obj = Cpanel::JSON::XS->new->ascii->pretty(1)->allow_nonref; my $config_file = Path::Tiny::path ("config.json"); die "Must have config file" if (!$config_file->exists); my $config_raw = $config_file->slurp (); my $config; my $ret = eval { $config = $json_obj->decode ($config_raw); }; if (!$ret) { die "Error Parsing JSON\n$@\n"; } tcp_server $config->{LocalAddr}, $config->{LocalPort}, sub { my ($fh) = @_; print "host started\n"; my $handle = new AnyEvent::Handle ( fh => $fh, tls => "accept", tls_ctx => { cert_file => $config->{cert_file}, key_file => $config->{key_file} }, on_read => sub { my ($handle) = @_; print "ON_READ :" . $handle->{rbuf} . ":\n"; }, on_eof => sub { my ($handle) = @_; print "ON_EOF\n"; }, on_error => sub { my ($handle, $fatal, $message) = @_; print "ON_ERROR ($fatal) ($message)\n"; }, ); print "Handle created :$handle:\n"; }; print "Loop started\n"; EV::run; #### julian@work:~/git/LLMAssistant/reference/server$ ./Server4.pl 2023-08-17 19:18:28.000000 -0500 info AnyEvent: Autodetected model 'AnyEvent::Impl::EV', using it. Loop started host started Handle created :AnyEvent::Handle=HASH(0x555b2b5d6eb0): host started Handle created :AnyEvent::Handle=HASH(0x555b2aa87610): host started Handle created :AnyEvent::Handle=HASH(0x555b2aa876d0): ^C #### julian@work:~/git/LLMAssistant/reference/client$ ./Writer.pl 2023-08-17 19:18:32.000000 -0500 info AnyEvent: Autodetected model 'AnyEvent::Impl::EV', using it. Before push_write After push_write on_drain: Write :XX on_eof: julian@work:~/git/LLMAssistant/reference/client$ ./Writer.pl 2023-08-17 19:18:33.000000 -0500 info AnyEvent: Autodetected model 'AnyEvent::Impl::EV', using it. Before push_write After push_write on_drain: Write :XX on_eof: julian@work:~/git/LLMAssistant/reference/client$ ./Writer.pl 2023-08-17 19:18:35.000000 -0500 info AnyEvent: Autodetected model 'AnyEvent::Impl::EV', using it. Before push_write After push_write on_drain: Write :XX on_eof: #### { "LocalAddr": "127.0.0.1", "LocalPort": 9999, "cert_file": "cert.pem", "key_file": "key.pem" }