use v5.14; use Socket; use IO::Socket; require('server_lib.pl'); flush_system(); socket(SERVER,PF_INET,SOCK_STREAM,getprotobyname('tcp')); setsockopt(SERVER,SOL_SOCKET,SO_REUSEADDR,1); my $my_addr = sockaddr_in(5555,INADDR_ANY); bind(SERVER,$my_addr) or die "cant bind"; listen(SERVER,SOMAXCONN); REQUEST: while(accept(CLIENT,SERVER)){ if (my $pid = fork){ next REQUEST; } else{ #child close SERVER; my $ip = get_ip(*CLIENT); my $user_name; if(recv(CLIENT,$user_name,1024,0)){ if( user_exists($user_name) || ip_exists($ip) ){ send_to_ip($ip,"User name exists (please restart);\n"); say "Attempt to duplicate name '$user_name' from IP: $ip"; next REQUEST; } else{ cache($user_name,$ip); } my $conn_msg = "{$user_name Connected}"; say "$conn_msg: $ip"; global_send($conn_msg); while(recv(CLIENT,my $data,1024,0)){ last if !ip_exists($ip); my $msg = "[$user_name] $data"; say $msg; unless( special_command($msg) ){ global_send($msg); } } } my $disconn_msg = "{$user_name Disconnected}"; say $disconn_msg; global_send($disconn_msg); remove_user($user_name); exit; } } continue{ close(CLIENT); }