rendered paste bodyuse strict;
use IO::Socket::INET;
use IO::Select;
{ package MultiplexServer;
# Constructor
sub new {
my ( $class ) = @_;
my $self = {
_connected => 0,
_addr => undef,
_port => undef,
_proto => undef,
_listen => undef,
_reuse => undef,
_listening => undef,
_readset => undef,
_writeset => undef
};
bless $self, $class;
return $self;
}
# Getters/Setters
sub connected {
my ( $self ) = @_;
return $self->{_connected};
}
sub addr {
my ( $self, $addr ) = @_;
$self->{_addr} = $addr if defined($addr);
return $self->{_addr};
}
sub port {
my ( $self, $port ) = @_;
$self->{_port} = $port if defined($port);
return $self->{_port};
}
sub proto {
my ( $self, $proto ) = @_;
$self->{_proto} = $proto if defined($proto);
return $self->{_proto};
}
sub listen {
my ( $self, $listen ) = @_;
$self->{_listen} = $listen if defined($listen);
return $self->{_listen};
}
sub reuse {
my ( $self, $reuse ) = @_;
$self->{_reuse} = $reuse if defined($reuse);
return $self->{_reuse};
}
sub start {
my ( $self ) = @_;
$self->{_listening} = IO::Socket::INET->new(
LocalAddr => $self->{_addr},
LocalPort => $self->{_port},
Proto => $self->{_proto},
Listen => $self->{_listen},
Reuse => $self->{_reuse}
);
die "Could not create socket: $!\n" unless $self->{_listening};
$self->{_writeset} = IO::Select->new();
$self->{_readset} = IO::Select->new($self->{_listening});
1;
}
sub check {
my ( $self ) = @_;
while (1) {
my ( $read_handles, $write_handles ) = IO::Select->select($self->{_readset}, $self->{_writeset}, undef, 0);
foreach my $rh (@$read_handles) {
if ($rh == $self->{_listening}) {
print 'New connection received!!';
my $new_sock = $rh->accept();
$self->{_readset}->add($new_sock);
$self->{_writeset}->add($new_sock);
} else {
my $buffer = <$rh>;
if ($buffer) {
print 'Data can be read!!';
print $buffer;
} else {
print 'Connection dropped.';
$self->{_readset}->remove($rh);
$self->{_writeset}->remove($rh);
close($rh);
}
}
}
}
}
1;
}