#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 4;
use IO::Socket::Telnet::HalfDuplex;
# can use whatever ping value you want
pipe my $read, my $write;
my $IAC = chr(255);
my $DO = chr(253);
my $WONT = chr(252);
my $PONG = chr(105);
my $localport = 23460;
my $pid;
unless ($pid = fork) {
my $ping = 0;
my $server = IO::Socket::INET->new(
LocalAddr => '127.0.0.1',
LocalPort => $localport,
Listen => 1,
);
die "can't create server: $!" if !$server;
my $connection = $server->accept;
my $buf;
my $tested = 0;
while (defined $connection->recv($buf, 4096)) {
# read of 0 bytes means that the socket is closed
last unless defined $buf && length $buf;
my $gotpong = ($buf =~ s/$IAC$DO$PONG//);
if (!$tested) {
print { $write } "$buf\n";
$tested = 1;
$connection->send('test');
}
if ($gotpong) {
$ping++;
$connection->send("$IAC$WONT$PONG");
}
}
print { $write } "$ping\n";
close $write;
exit;
}
# give the server time to set up
sleep 1;
my $pong = 0;
my $client = IO::Socket::Telnet::HalfDuplex->new(
PeerAddr => '127.0.0.1',
PeerPort => $localport,
PingOption => ord($PONG),
);
$client->telnet_simple_callback(sub {
my $self = shift;
my ($msg) = @_;
my $ping = ord($PONG);
$pong++ if $msg =~ /$ping$/;
return '';
});
$client->send('blah');
my $str = $client->read;
$client->close;
is($pong, 1, "client got a pong from the server");
is($str, 'test', "client got the right string");
my $buf;
read $read, $buf, 7;
my @results = split /\n/, $buf;
is($results[0], 'blah', 'server got the right string');
is($results[1], 1, 'server got a ping from the client');