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 wanted to send the the perl code but when I inserted it here it was a mess. I was not sure how to send it with tags. If someone could please help me it would be very much appreciated. Thanks very much, Randall here is the code:
#!/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_request_rec, $find_response_rec, $price_call_rec, $pric +e_response_rec); our($find_resp_pr1,$find_resp_pr2,$find_resp_pr3,$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::INET ( LocalHost => '172.17.8.201', # IP Address Hos +t 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; $find_resp = 'GCD 000'; #Used in Testing $read_set = new IO::Select(); # create handle set for reading $read_set->add($s); # add the main socket to the set connect_to_oracle_db(); print "At Host/Port listening. Waiting to receive transactions from Ir +oam Client...\n"; while (1) { # Continous Listening on Port for a connection # get a set of readable handles (blocks until at least one han +dle is ready) my ($rh_set) = IO::Select->select($read_set, 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 connecti +on and # we should accept() it and then add the new socket to the $ +read_set if ($rh == $s) { print "Main socket and incoming connection.. add to the read +able set...\n"; $ns = $rh->accept(); $read_set->add($ns); ##already added at beginning print "Value of rh_set is @$rh_set..after adding ns connectio +n\n"; # otherwise it is an ordinary socket and we should read and p +rocess the request }else{ print "Its an ordinary socket, so read and process the requ +est ...\n"; print "Connected from: ", $rh->peerhost(); # Display P +eer Connection from Info print " Port: ", $rh->peerport(), "\n"; $buf = <$rh>; $iroam_req_type = substr($buf,0,8); #Extract the requesto +r type from the string sent from the Iroam Client print "Requestor type extracted from the Iroam Data: $iroam +_req_type||Requestor Type\n"; #Display value of the Iroam requestor if($buf) { # return normal input and process $buf print "Iroam transaction received from Iroam Client:\n"; + #Display value of the Iroam data from Iroam print "$buf\n"; #Display value of the Iroam data from +Iroam if ($iroam_req_type =~ /FindMin/){ $find_min_request_rec = $buf; }elsif ($iroam_req_type =~ /PriceCall/){ $price_call_rec = $buf; } pass_transaction_to_iroam_package(); ###print "s send value is: $s->send($find_response_rec) + \n"; ###$s->send($find_response_rec); $rh->send($find_response_rec); print "rh send value is: $rh->send($find_response_rec) \ +n"; }else { # the client has closed the socket print "Iroam client has closed the socket. Socket will be +removed from the readbale set and closed...\n"; # remove the socket from the $read_set and close it $read_set->remove($rh); close($rh); } } } } sub connect_to_oracle_db{ print "Connect to the Oracle Database sub....\n"; $dbh = DBI->connect( 'DBI:Oracle:dev', 'perluser', 'oraperl', {AutoCommit => 0, RaiseErr +or => 1} ) or die "Couldn't connect to database +:".DBI->errstr; } sub pass_transaction_to_iroam_package{ print "pass transaction to iroam package sub....\n"; my $v_param_iroam_resp; if ($iroam_req_type =~ /FindMin/){ my $csr = $dbh->prepare(q{ begin :v_param_iroam_resp:= WIRELESS_IR +OAM_PKG.Lookup_Min_Request(:find_min_request_rec); end; }); $csr->bind_param(":find_min_request_rec", $find_min_request_rec +); $csr->bind_param_inout(":v_param_iroam_resp", \$v_param_iroam_r +esp,400); $csr->execute() or die "Couldn't execute pass transaction to ir +oam package sub ".DBI->errstr; $find_response_rec = $v_param_iroam_resp; $find_resp_pr1 = substr($find_response_rec ,0,90); $find_resp_pr2 = substr($find_response_rec ,91,90); $find_resp_pr3 = substr($find_response_rec ,182,90); $find_resp_pr4 = substr($find_response_rec ,273,90); $find_resp_pr5 = substr($find_response_rec ,364,11); print "Value of v param iroam resp is: $v_param_iroam_resp\n"; print "Value of find response rec is: $find_resp_pr1\n"; print "Value of find response rec is: $find_resp_pr2\n"; print "Value of find response rec is: $find_resp_pr3\n"; print "Value of find response rec is: $find_resp_pr4\n"; print "Value of find response rec is: $find_resp_pr5\n"; }elsif ($iroam_req_type =~ /PriceCall/){ my $csr = $dbh->prepare(q{ begin :v_param_iroam_resp:= WIRELESS_IR +OAM_PKG.Price_Call(:price_call_rec); end; }); $csr->bind_param(":price_call_rec", $price_call_rec); $csr->bind_param_inout(":v_param_iroam_resp", \$v_param_iroam_r +esp,400); $csr->execute() or die "Couldn't execute pass transaction to ir +oam package 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"; # Infor +m that connection to client is closed }

In reply to Perl Sockets by crawfordr

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.