Hi there,
I need a socket (server) in perl that when session created by a client request, take a string and after some proccesing on it, send a string(response) and close the session. but socket wait for future requests.
It's possible to lead me?! :(? or write a psudo code?
Thanks in advance.
This is my server code
#!/usr/bin/perl -w
use strict;
use warnings;
use threads;
use POSIX 'setsid';
use Connection; #Connection Interface plus below line
use IO::Socket qw(:DEFAULT :crlf);
use XML::DOM;
our $session;
use ObjectAddress;
use WebFilter;
#&Daemonization();
#######################################
my ($bytes_out,$bytes_in) = (0,0);
our $quit=0;
$SIG{INT} = sub { $quit++};
my $sock = Connection->new();
# Declare a few variables for XML Handling.
my ($packet, %protoCount, $nodeName, @pktInfoArray, $pktInfo);
# Instantiate a new XML::DOM parser.
my $parser = XML::DOM::Parser->new();
########################################
##### Engine's Instantiates #########
my $OBJ = ObjectAddress->new();
########################################
while (!$quit)
{
die "Can't fork" unless defined (my $child = fork);
exit 0 if $child;
next unless $session = $sock->accept;
#############################Session & Requests & Responses ###########################
my $peer = gethostbyaddr($session->peeraddr,AF_INET) || $session->peerhost;
my $port = $session->peerport;
warn "Connection from [$peer,$port]\n";
my $message = <$session>;#Read Requests
############## XML DOM & Decision Maker Arena #####################
my $doc = $parser->parsestring($message);
my $root = $doc->getDocumentElement();
# Retrieve an array of all nodes.
my @packetArray = $root->getChildNodes();
# Loop through the array.
foreach $packet (@packetArray)
{
if ($packet->getNodeType() == ELEMENT_NODE)
{
print "Seqnum: " . $packet->getAttribute("seqnum") . "\n";
@pktInfoArray = $packet->getChildNodes();
foreach $pktInfo (@pktInfoArray)
{
if ($pktInfo->getNodeType() == ELEMENT_NODE)
{
$nodeName = $pktInfo->getNodeName();
$nodeName =~ s/(\w+)/\u \L$1/g;
print "$nodeName";
if ($pktInfo->getNodeName() eq "protocol")
{
if ($protoCount{$pktInfo->getFirstChild()->getData})
{
$protoCount{$pktInfo->getFirstChild()->getData}++;
}else{
$protoCount{$pktInfo->getFirstChild->getData} = 1;
}
}
print " : " . $pktInfo->getFirstChild()->getData . "\n";
}
}
print "\n";
}
}
my ($key);
print "\n----------------------------\n";
print "Protocol Summary\n";
foreach $key (keys %protoCount) {
print "$key\t$protoCount{$key}\n";
}
$doc->dispose();
############# END OF XML DOM & Decision Maker Arena ##################
syswrite ($session, "My answer string");
close $session;
#warn "Connection from [$peer,$port] finished\n";
##################### END OF Session & Requests & Responses #####################################
}#For Listen mode
sub Daemonization
{
die "Can't fork" unless defined (my $child = fork);
exit 0 if $child;
setsid();
open(STDIN, "</dev/null");
open(STDOUT, ">/dev/null");
open(STDERR, ">&STDOUT");
chdir '/';
umask(0);
$ENV{PATH} = '/bin:/sbin:/usr/bin:/usr/sbin';
return $$;
}
And this is my client code
#!/usr/bin/perl
use strict;
use Socket qw(:DEFAULT :crlf);
use IO::Handle;
our $array="<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE sniffer_data SYSTEM \"netlog2.dtd\">
<sniffer_data>
<packet seqnum=\"tx_1\">
<protocol>SMTP</protocol>
<timestamp>1</timestamp>
<source>scooby</source>
<dest>smtp_server</dest>
</packet>
<packet seqnum=\"tx_2\">
<protocol>FTP</protocol>
<timestamp>4</timestamp>
<source>shaggy</source>
<dest>ftp_server</dest>
</packet>
<packet seqnum=\"tx_3\">
<protocol>SNMP</protocol>
<timestamp>7</timestamp>
<source>sys_admin</source>
<dest>gateway</dest>
</packet>
<packet seqnum=\"tx_4\">
<protocol>DNS</protocol>
<timestamp>8</timestamp>
<source>casper</source>
<dest>dns_server</dest>
</packet>
<packet seqnum=\"tx_5\">
<protocol>HTTP</protocol>
<timestamp>9</timestamp>
<source>casper</source>
<dest>web_server</dest>
</packet>
<packet seqnum=\"tx_6\">
<protocol>SSH</protocol>
<timestamp>11</timestamp>
<source>speedracer</source>
<dest>accounting</dest>
</packet>
<packet seqnum=\"tx_7\">
<protocol>SMTP</protocol>
<timestamp>13</timestamp>
<source>scooby</source>
<dest>smtp_server</dest>
</packet>
<packet seqnum=\"tx_8\">
<protocol>SMTP</protocol>
<timestamp>13</timestamp>
<source>scooby</source>
<dest>smtp_server</dest>
</packet>
</sniffer_data>
";
my ($bytes_out,$bytes_in) = (0,0);
my $host = shift || 'localhost';
my $port = shift || getservbyname('echo','tcp');
my $protocol = getprotobyname('tcp');
$host = inet_aton($host) or die "$host: unknown host";
socket(SOCK, AF_INET, SOCK_STREAM, $protocol) or die "socket() failed: $!";
my $dest_addr = sockaddr_in($port,$host);
connect(SOCK,$dest_addr) or die "connect() failed: $!";
SOCK->autoflush(1);
syswrite(SOCK, $array);
# $_=<SOCK>;
# print $_;
close SOCK;
I wish, server get a xml parse it and send a response. but it does not work when client or server be responsible even for receiving a str and sending a str! why?