Hello,
I have created a perl script that connects to a specific socket (Ip address/port) using protocall of TCP. It is the server socket script. There is also coding to manage multiple handles by usung the select() in the coding. This was needed due to the fact we expect a large volume of transactions at any given time on the client's side. The script's purpose is to connect to the client's port and listen for connections, accept the connections, receive the data, then pass the data to an oracle database function, that function returns different data back to the server script, then sends that data back to the client's file handler that it was received on. The client file handler is waiting for that response. The data must be sent back to the same file handler that it was received on. The problem that I am having is that the client is not receiving the data back. I think there may be problem in how the script is coded to send the data back to the same file handler. I have tried all kinds of things and nothing seems to work. maybe the code should be written a different way. I have included the perl code below
If someone could please help me it would be very much appreciated.
Thanks very much,
Randall
<c>#!/usr/bin/perl -w
require 5.002;
use strict;
use IO::Socket;
use IO::Select;
use DBI;
use DBD::Oracle;
our ($dbh);
our ($find_min_requ est_rec, $find_response_ rec);
our ($price_call_re c, $price_response _rec);
our ($find_resp_pr1 ,$find_resp_pr2 ,$find_resp_pr3 );
our ($find_resp_pr4 ,$find_resp_pr5 );
our $read_set ;
our $rh;
our $ns;
our $buf;
our $find_resp;
our $iroam_req_type ;
# Create the receiving socket
my $s = new IO::Socket::INE T (
LocalHost => '172.17.8.201', # IP Address Host to listen on
LocalPort => '18490', # Port Number Host to listen on
Proto => 'tcp',
Listen => 5,
Reuse => 1,
);
die "Could not create socket: $!\n" unless $s;
$read_set = new IO::Select(); # create handle set for reading
$read_set->add($s); # add the main socket to the set
connect_to_orac le_db();
print "At Host/Port listening...\n" ;
while (1) { # Continous Listening on Port for a connection
# get a set of readable handles(blocks until at least one handle is ready)
my ($rh_set) = IO::Select->select($read_s et, undef, undef, 0);
# take all readable handles in turn
foreach $rh (@$rh_set) {
print "Process each readable handle...\n";
print "Value of rh is $rh...\n";
print "Value of rh_set is @$rh_set..\n";
# if it is the main socket then we have an incoming
# connection and we should accept() it and then add
# the new socket to the $read_set
if ($rh == $s) {
print "Main socket/incoming connection add to readable set\n";
$ns = $rh->accept();
$read_set->add($ns); ##already added at beginning
print "Value of rh_set is @$rh_set.after adding connection\n";
# otherwise it is an ordinary socket and we should read
#and process the request
}else{
print "Its an ordinary socket,so read and process the request ...\n";
print "Connected from: ", $rh->peerhost();#Di splay Peer Connection
print " Port: ", $rh->peerport(), "\n";
$buf = <$rh>;
$iroam_req_type = substr($buf,0,8 );#Extract the requestor type
print "Requestor type extracted is: $iroam_req_type \n";#Display Iroam req
if($buf) { # return normal input and process $buf
print "Iroam transaction recd:\n";# Iroam Data
print "$buf\n"; #Display value of the Iroam data from Iroam
if ($iroam_req_typ e =~ /FindMin/){
$find_min_reque st_rec = $buf;
}elsif ($iroam_req_typ e =~ /PriceCall/){
$price_call_rec = $buf;
}
pass_transactio n_to_iroam_pack age();
$rh->send($find_res ponse_rec);
print "rh send value is: $rh->send($find_res ponse_rec) \n";
}else { # the client has closed the socket
print "Iroam client has closed the socket.\n";
# remove the socket from the $read_set and close it
$read_set->remove($rh);
close($rh);
}
}
}
}
sub connect_to_orac le_db{
print "Connect to the Oracle Database sub....\n";
$dbh = DBI->connect(
'DBI:Oracle:dev ',
'perluser',
'oraperl',
{AutoCommit => 0, RaiseError => 1}
) or die "Couldn't connect to database:".DBI->errstr;
}
sub pass_transactio n_to_iroam_pack age{
print "pass transaction to iroam package sub....\n";
my $v_param_iroam_ resp;
if ($iroam_req_typ e =~ /FindMin/){
my $csr = $dbh->prepare(q{
begin
:v_param_iroam_ resp:= WIRELESS_IROAM_ PKG.Lookup_Min_ Request(:find_m in_request_rec) ;
end;
});
$csr->bind_param(":f ind_min_request _rec", $find_min_reque st_rec);
$csr->bind_param_ino ut(":v_param_ir oam_resp", \$v_param_iroam _resp,400);
$csr->execute()
or die "Couldn't exe pass transaction iroam pkg sub ".DBI->errstr;
$find_response_ rec = $v_param_iroam_ resp;
$find_resp_pr1 = substr($find_re sponse_rec ,0,90);
$find_resp_pr2 = substr($find_re sponse_rec ,91,90);
$find_resp_pr3 = substr($find_re sponse_rec ,182,90);
$find_resp_pr4 = substr($find_re sponse_rec ,273,90);
$find_resp_pr5 = substr($find_re sponse_rec ,364,11);
}elsif ($iroam_req_typ e =~ /PriceCall/){
my $csr = $dbh->prepare(q{
begin
:v_param_iroam_ resp:= WIRELESS_IROAM_ PKG.Price_Call( :price_call_rec );
end;
});
$csr->bind_param(":p rice_call_rec", $price_call_rec );
$csr->bind_param_ino ut(":v_param_ir oam_resp", \$v_param_iroam _resp,400);
$csr->execute() or die "Couldn't exe pass iroam pkg sub ".DBI->errstr;
$price_response _rec = $v_param_iroam_ resp;
print "Value of v param iroam resp is: $v_param_iroam_ resp\n";
print "Value of price response is: $price_response _rec \n";
}
print "Processed transaction through the Iroam package\n";
}</c>