Hi,
You can fork for multiple connections. and define $SIG{INT} for ctrl-c:
Here is an example;
$SIG{INT} = \&destroy_server; #ctrl -> destroy_server
...
...
...
die "can not fork: $!" unless defined ($kid_pid=fork());
if ($kid_pid) {
while(<$new_sock>) {
print $_;
my $comm = `$_`;
print $new_sock $comm;
}
close ($new_sock);
}
..
..
..
sub destroy_server {
print $new_sock "Server is destroyed\n";
exit;
}
==
Final code:
#!/usr/bin/perl
use IO::Socket;
use IO::Select;
my @sockets;
my $machine_addr = '127.0.0.1';
$SIG{INT} = \&quit_srv;
$main_sock = new IO::Socket::INET(LocalAddr=>$machine_addr,
LocalPort=>12000,
Proto=>'tcp',
Listen=>3,
Reuse=>1,
);
die "Could not connect: $!" unless $main_sock;
print "Starting Server\n";
my($new_sock, $c_addr, $buf);
while (($new_sock, $c_addr) = $main_sock->accept())
{
my ($client_port, $c_ip) =
sockaddr_in($c_addr);
my $client_ipnum = inet_ntoa($c_ip);
my $client_host =
gethostbyaddr($c_ip, AF_INET);
print "got a connection from: $client_host",
" [$client_ipnum]\n";
die "can't fork: $!" unless defined ($kidpid=fork());
if ($kidpid) {
while(<$new_sock>)
{
print $_;
my $comm = `$_`;
print $new_sock "$comm";
}
close($new_sock);
}
}
$readable_handles = new IO::Select();
$readable_handles->add($main_sock);
while (1)
{
($new_readable) = IO::Select->select($readable_handles, undef, undef,
0);
foreach $sock (@$new_readable)
{
if ($sock == $main_sock)
{
$new_sock = $sock->accept();
$readable_handles->add($new_sock);
}
else
{
$buf = <$sock>;
if ($buf)
{
print "$buf\n";
my @sockets = $readable_handles->can_write();
print $sock "You sent $buf\n";
foreach my $sck(@sockets){print $sck "$buf\n";}
}
else
{
$readable_handles->remove($sock);
close($sock);
}
}
}
}
print "Terminating Server\n";
close $main_sock;
getc();
sub quit_srv() {
print "Server dest\n";
print $new_sock "Server destroyed\n";
exit;
}
On Thu, 2008-03-20 at 10:24 +0530, Anirban Adhikary wrote:
> Dear List
> I have able to write the client-server architecture script *( Based on the
> script send by ZENTARA )* which can execute command at the server end and
> display the result at client end . But the problem I am facing that the
> server can not able to support multiple client it is only able to support a
> single client. I am also trying to implement when the server script will
> stopeed *( Like using ctrl +c)* then all clients will get some message from
> server about the connection closing.In the server side when some client get
> disconnected from server some message will get priented in the server
> console . I am posting my code here U guys pls help me how to solve these
> problems.
>
> Thanks & Regards in advance
> Anirban Adhikary.
>
>
> *THE SERVER SCRIPT
> *#####################################################################
>
> #!/usr/bin/perl
> use IO::Socket;
> use IO::Select;
> my @sockets;
> my $machine_addr = '10.5.2.174';
> $main_sock = new IO::Socket::INET(LocalAddr=>$machine_addr,
> LocalPort=>12000,
> Proto=>'tcp',
> Listen=>3,
> Reuse=>1,
> );
> die "Could not connect: $!" unless $main_sock;
> print "Starting Server\n";
> my($new_sock, $c_addr, $buf);
> while (($new_sock, $c_addr) = $main_sock->accept())
> {
> my ($client_port, $c_ip) =
> sockaddr_in($c_addr);
> my $client_ipnum = inet_ntoa($c_ip);
> my $client_host =
> gethostbyaddr($c_ip, AF_INET);
> print "got a connection from: $client_host",
> " [$client_ipnum]\n";
>
> while(<$new_sock>)
> {
> print $_;
> my $comm = `$_`;
> print $new_sock "$comm";
> }
> close($new_sock);
> }
>
> $readable_handles = new IO::Select();
> $readable_handles->add($main_sock);
>
> while (1)
> {
> ($new_readable) = IO::Select->select($readable_handles, undef, undef, 0);
> foreach $sock (@$new_readable)
> {
> if ($sock == $main_sock)
> {
> $new_sock = $sock->accept();
> $readable_handles->add($new_sock);
> }
> else
> {
> $buf = <$sock>;
> if ($buf)
> {
> print "$buf\n";
> my @sockets = $readable_handles->can_write();
> print $sock "You sent $buf\n";
> foreach my $sck(@sockets){print $sck "$buf\n";}
> }
> else
> {
> $readable_handles->remove($sock);
> close($sock);
> }
> }
> }
> }
> print "Terminating Server\n";
> close $main_sock;
> getc();
>
>
>
> *THE CLIENT SCRIPT
> ####################################################################
>
> *#!/usr/bin/perl
> #use strict;
> use IO::Socket;
> my ( $host, $port, $kidpid, $handle, $line );
> ( $host, $port ) = ('10.5.2.174',12000);
> my $name = shift || '';
> if($name eq ''){print "Enter the command to run?\n"}
> chomp ($name = <>);
>
> # create a tcp connection to the specified host and port
> $handle = IO::Socket::INET->new(
> Proto => "tcp",
> PeerAddr => $host,
> PeerPort => $port
> ) or die "can't connect to port $port on $host: $!";
> $handle->autoflush(1); #output gets there right away
>
> print STDERR "[Connected to $host:$port]\n";
> print $handle "Hello $name!\n";
>
> # split the program into two processes, identical twins
> die "can't fork: $!" unless defined( $kidpid = fork() );
>
> # the if{} block runs only in the parent process
> if ($kidpid)
> {
> # copy the socket to standard output
> while ( defined( $line = <$handle> ) )
> {
> print STDOUT $line;
> }
> kill( "TERM", $kidpid ); # send SIGTERM to child
> }
>
> # the else{} block runs only in the child process
> else {
> # copy standard input to the socket
> while ( defined( $line = <STDIN> ) )
> {
> print $handle "$line";
>
> }
> }
> *
> *
> On Wed, Mar 19, 2008 at 7:05 PM, zentara <[EMAIL PROTECTED]> wrote:
>
> > On Tue, 18 Mar 2008 22:16:28 +0530, [EMAIL PROTECTED] ("Anirban
> > Adhikary") wrote:
> >
> > >I have a question regarding this client - server script. I am using two
> > >modules in my script . One is IO::Socket and another is IO::Select. Now
> > my
> > >question is if I want to implement an architecture so that client script
> > >will send a command to the server* [*which doesn't require root privilege
> > to
> > >run ( like ls -l .... ps etc.)* ] *the server script then execute that
> > >command in the server machine and the output will be displayed again at
> > >client's machine console or output will be stored in the client machine's
> > >specified directory. If yes then how? Is it possible to implement such
> > >architecture by using these two modules? If u people know some good
> > >tutorials related with this type of architecture then please let me know.
> > If
> > >I get any example code available related with this architecture from ur
> > side
> > >I will be highly privileged.
> > >
> > >Thanks & Regards In Advance
> > >Anirban Adhikary.
> >
> > Hi, for a good tutorial about the basics of sockets, see
> > http://www.cs.uno.edu/~golden/teach.html<http://www.cs.uno.edu/%7Egolden/teach.html>
> > and look for the
> > Perl socket examples. He does it from the basic level but explains
> > what each step does in detail.
> > Then you can move up from using the basic Sockets and select, to the
> > easier modules IO::Socket and IO::Select ( which handle many of the
> > tedious details for you).
> >
> >
> > For a good example of problems using sockets to send data on demand,
> > see http://perlmonks.org?node_id=627553
> >
> >
> > For things like executing remote commands on a server, it is highly
> > recommended to use ssh instead, for security reasons.
> > See http://perlmonks.org?node_id=569657 for a demo of how
> > to use Net::SSH2 which is the starte of the art preferred module now.
> > It shows how to run system commands like ls.
> >
> > zentara
> >
> >
> > --
> > I'm not really a human, but I play one on earth.
> > http://zentara.net/japh.html
> >
> > --
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> > http://learn.perl.org/
> >
> >
> >
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/