#!/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"
}