FAQ
Hi,
I have made a TCP socket, both a server and a client, and it works just
fine, except from the fact that I cant receive more than one input line from
the server when I execute a Unix command trough the socket. And when I am
trying to send a ps command from the client to the server to count how many
proc a certain user are running, the client does not receive the output,
like the server does.

This problem is a bit hard to explain, so please se my two scripts for more:

*server.pl*

#!/usr/bin/perl

# Needed pkg
use Getopt::Std;
use strict "vars";

# Global variables
my $VERBOSE = 0;
my $DEBUG = 0;

################################################################
# handle flags and
# Example: c == "-c", c: == "-c argument"
my $opt_string = 'hvdk:p:';
getopts( "$opt_string", \my %opt ) or usage() and exit 1; # exit other than
0 = error!!

# print help message if -h is invoked
if ( $opt{'h'} ){
usage();
exit 0;
}

$VERBOSE = 1 if $opt{'v'};
$DEBUG = 1 if $opt{'d'};
my $PORT = $opt{'p'};

if ( not $PORT ) {
print "You need to apply a port number";
usage();
exit 1;
}

# main program content
use IO::Socket;
$SIG{"CHILD"} = "IGNORE"; # Enable us to not make the children hangout and
wait for the parent to die, (children will die)

my $sock = new IO::Socket::INET(
LocalPort => $PORT,
Proto => 'tcp',
Listen => SOMAXCONN,
Reuse => 1
);

if ( $sock ) {
print "Waiting for clients...\n";
while ( my $connection = $sock->accept() ){
my $pid = fork(); # how the server knows if the porc is parent (pid =
xxx) or child (0)
if ( $pid == 0 ) {
my $client = $connection->peerhost(); # use $connection instead of
$sock to get ipaddr
print "Connection to the $client\n";

my $buffer = <$connection>;
chomp $buffer;
print "Client said: '$buffer'\n";
# sleep 7;

print $connection "Message recived: $buffer\n";

close($connection);
exit; # server child should die after finish the conversation
} else {
close($connection);
next;
}
}
} else {
die "Error: $!\n";
}

close($sock);

verbose("verbose\n");
debug("noe\n");



##########################################
# Helper routines

sub usage {
# print the correct use of this script
print "Usage:\n";
print "-h Usage\n";
print "-v Verbose\n";
print "-d Debug\n";
}

sub verbose {
print $_[0] if ( $VERBOSE or $DEBUG );
}

sub debug {
print $_[0] if ( $DEBUG );
}


*client.pl *

#!/usr/bin/perl

# Needed pkg
use Getopt::Std;
use strict "vars";

# Global variables
my $VERBOSE = 0;
my $DEBUG = 0;

################################################################
# handle flags and
# Example: c == "-c", c: == "-c argument"
my $opt_string = 'hvdk:p:H:c:';
getopts( "$opt_string", \my %opt ) or usage() and exit 1; # exit other than
0 = error!!

# print help message if -h is invoked
if ( $opt{'h'} ){
usage();
exit 0;
}

$VERBOSE = 1 if $opt{'v'};
$DEBUG = 1 if $opt{'d'};
my $PORT = $opt{'p'};
my $SERVER = $opt{'H'};
my $COMMAND = $opt{'c'};

if ( not ( $PORT and $SERVER )){
print "You need to supply a port number and hostname\n";
usage();
exit 1;
}


# main program content

use IO::Socket;

my $connection = new IO::Socket::INET(
PeerAddr => $SERVER,
PeerPort => $PORT,
Proto => 'tcp'
) or die "Failed to connect: $!\n";

if ( $connection ) {
print "Connection etablished...\n";

# print $connection "hello world!\n";
# print $connection "Isabelle says hello\n";

my $load = `uptime | awk '{print \$8 " " \$9 " " \$10 " " \$11 " "
\$12}'`;
my $uptime = `uptime | awk '{print \$2 " " \$3 " " \$4}'`;
my $mem_tot = `cat /proc/meminfo | grep MemTotal`;


if ($COMMAND =~ m/load/){
print $connection $load;
}

if ($COMMAND =~ m/uptime/){
print $connection $uptime;
}

if ($COMMAND =~ m/memory/){
print $connection "$mem_tot\n";
}

if ($COMMAND =~ m/user:/){

while ($COMMAND){
my @array = split(":", $COMMAND);
my $user = $array[1];
my $ps = `ps aux | grep $user | wc -l`;
print $connection $ps;
sleep 7;
}
}

# $mem_free\n$mem_buff\nswa_tot\n$swa_free\n";
# print $connection `$COMMAND`;

my $response = <$connection>;

print "Server replied: '$response'\n";

close($connection);
}


##########################################
# Helper routines

sub usage {
# print the correct use of this script
print "Usage:\n";
print "-h Usage\n";
print "-v Verbose\n";
print "-d Debug\n";
print "-p Port\n";
print "-H Host/Server\n";

}

sub verbose {
$_[0] if ( $VERBOSE or $DEBUG );
}

sub debug {
print $_[0] if ( $DEBUG );
}

Search Discussions

Discussion Posts

Follow ups

Related Discussions

Discussion Navigation
viewthread | post
posts ‹ prev | 1 of 2 | next ›
Discussion Overview
groupbeginners @
categoriesperl
postedApr 10, '10 at 7:32a
activeApr 10, '10 at 8:01a
posts2
users2
websiteperl.org

2 users in discussion

Uri Guttman: 1 post Niko zuna: 1 post

People

Translate

site design / logo © 2021 Grokbase