#!/usr/bin/perl use strict; use warnings; use IO::Select; use IO::Socket::INET; my $hsock = IO::Socket::INET->new ( Listen => 5, LocalAddr => '0.0.0.0', LocalPort => 5885, Proto => 'tcp', Type => SOCK_STREAM, Reuse => 1 ); my $handles = IO::Select->new($hsock); my %user; while (1) { last if keys %user > 4; my @ready = $handles->can_read(3); for my $sock (@ready) { if ($sock eq $hsock) { my $new_sock = $hsock->accept(); $handles->add($new_sock); $new_sock->send("Welcome\r\n"); $_->send("New user joined\r\n") for values %user; $user{$new_sock} = $new_sock; } else { my $buff = <$sock>; if ($buff) { $buff =~ tr/\r\n//d; next if $buff =~ /^\s*$/; $_->send("$buff\r\n") for values %user; } else { $handles->remove($sock); delete $user{$sock}; $_->send("User left\r\n") for values %user; } } } }