<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.0.6603.0">
<TITLE>Perl Socket programming problem with Windows</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->
<BR>

<P><FONT SIZE=2 FACE="Arial">Hello,</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">I'm writing a TCP Server program that polls waits for socket connections on a specified port.&nbsp; The connection will be coming from a &quot;black box&quot; test harness written in C#.Net.&nbsp; The connection hand-shake design is as follow:</FONT></P>

<P><FONT SIZE=2 FACE="Arial">Black Box requests to connect to the Server</FONT>

<BR><FONT SIZE=2 FACE="Arial">Server responds back with a &quot;Challenge&quot; with a hardcode string &quot;1001|1000&quot;</FONT>

<BR><FONT SIZE=2 FACE="Arial">The Black Box reads the Challenge, then returns another request as &quot;1001|1100&quot;</FONT>

<BR><FONT SIZE=2 FACE="Arial">The Server will then processes the second request.</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">On my Server end, I can start the server and wait for connections. When the Client makes a request to the Server, the Server accepts the connections, but I can't read the data being sent. When I attempt to read the data stream on the Server, it wait about 5 seconds, then the Client hangs. I'm using IO::Socket and IO::Select, and I've tried read, recv, &lt;&gt;, Open(filehandle), all attempts result with the same error.</FONT></P>

<P><FONT SIZE=2 FACE="Arial">Here's my Server code:</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">use IO::Socket qw(:DEFAULT :crlf);</FONT>

<BR><FONT SIZE=2 FACE="Arial">#use IO::Socket;</FONT>

<BR><FONT SIZE=2 FACE="Arial">#use IO::Socket::INET;</FONT>

<BR><FONT SIZE=2 FACE="Arial">use IO::Handle;</FONT>

<BR><FONT SIZE=2 FACE="Arial">use IO::Select;</FONT>

<BR><FONT SIZE=2 FACE="Arial">use POSIX;</FONT>

<BR><FONT SIZE=2 FACE="Arial">use Socket;</FONT>

<BR><FONT SIZE=2 FACE="Arial">use Fcntl;</FONT>

<BR><FONT SIZE=2 FACE="Arial">use Tie::RefHash;</FONT>

<BR><FONT SIZE=2 FACE="Arial">use Net::Socket::NonBlock;</FONT>

<BR><FONT SIZE=2 FACE="Arial">local($/) = LF;</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial"># Setup global variables</FONT>

<BR><FONT SIZE=2 FACE="Arial">$ViewServer = &quot;M:\\paul.krcma_csm_test\\PaulsTest\\release1&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">#$ServerName = 'EPWS3001';</FONT>

<BR><FONT SIZE=2 FACE="Arial">$ServerName = 'RCSLMN10L3CNMW6';</FONT>

<BR><FONT SIZE=2 FACE="Arial">$port_num = '8003';</FONT>

<BR><FONT SIZE=2 FACE="Arial">$ReqId = &quot;1000&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">$client = &quot;&quot;;</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial"># Create socket object</FONT>

<BR><FONT SIZE=2 FACE="Arial">$server = IO::Socket::INET-&gt;new('LocalPort' =&gt; $port_num,</FONT>

<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; 'Proto' =&gt; 'tcp',</FONT>

<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; 'Type' =&gt; SOCK_STREAM,</FONT>

<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; 'Block' =&gt; 0,</FONT>

<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; 'Listen' =&gt; 16,</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Reuse' =&gt; 1)</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; or die &quot;Can't create socket ($!)\n&quot;;</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">%inbuffer = ();</FONT>

<BR><FONT SIZE=2 FACE="Arial">%outbuffer = ();</FONT>

<BR><FONT SIZE=2 FACE="Arial">%ready = ();</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">tie %ready, 'Tie::RefHash';</FONT>

<BR><FONT SIZE=2 FACE="Arial">#nonblock($server);</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; # Create a new IO::Socket Object</FONT>

<BR><FONT SIZE=2 FACE="Arial">$select = IO::Select-&gt;new;</FONT>

<BR><FONT SIZE=2 FACE="Arial">$select-&gt;add($server);</FONT>

<BR><FONT SIZE=2 FACE="Arial">#my $select-&gt;add($socket);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Add a Listener to the IO::Socket object</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">print &quot;Server listening\n&quot;;</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial"># Wait for incoming requests, and open new sockets when needed</FONT>

<BR><FONT SIZE=2 FACE="Arial">while (1) {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; $client;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; $rv;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; $data;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; $sn;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; foreach $client ($select-&gt;can_read()) {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; print &quot;Creating TCPSocketListener\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; print &quot;Checking for client = server\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; if($client == $server) {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #my $new;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Level 1 If</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Create a new socket and add the handles to the Select object</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $client = $server-&gt;accept();</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $select-&gt;add($client);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $client-&gt;autoflush(1);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $client-&gt;blocking(false);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ClientName = gethostbyaddr($client-&gt;peeraddr, AF_INET);</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print &quot;data is $rv{$client}\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print &quot;New Socket opened\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print &quot;Generating RequestId and sending Challenge to back to Core\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $buffer = '';</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rv = recv($client, $buffer, 1024,0);&nbsp;&nbsp;&nbsp;&nbsp; ###########&nbsp; This line causes the Client to hang&nbsp; ######################</FONT></P>

<P><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;Generate_ReqId($ReqId);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print &quot;Req ID = $ReqId\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;Reading data\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #$sn = $client-&gt;send($ReqId);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #while(&lt;$client&gt;) {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp; chop $_;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp; $data = $_;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #}</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;Data received is $data\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #$SendPack = $ReqId.&quot;|1000\015\012&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #$sn = $client-&gt;send($SendPack);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #$client &quot;$ReqId|1000&quot;;</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print &quot;Inside level 1 if\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print &quot;Authorizing user\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print $new &quot;$ReqId|0|&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;Leaving the client-server loop\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; }</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; else {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Fork the incoming connection from the parent</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;A separate connection\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;Packet is $packet\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&amp;process_connection;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $data = '';</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rv = $client-&gt;recv($data, POSIX::BUFSIZ, 0);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unless (defined($rv) &amp;&amp; length $data) {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Client disconnected so do some cleanup</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;Going to delete the buffers\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print $client &quot;OK&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete $inbuffer{$client};</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete $outbuffer{$client};</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete $ready{$client};</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $select-&gt;remove($client);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close $client;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $inbuffer{$client} .= $data;</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print &quot;&nbsp;&nbsp;&nbsp; Existing Connection\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print &quot;Received Authentication string from Core\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print $rv{$client};</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print &quot;Sending Authentication approval back to Core\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print $client &quot;$ReqId|0|&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&amp;process_connection;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ($inbuffer{$client} =~ s/(.*\n)//) {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;building array of requests\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push( @{$ready{$client}}, $1 );</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; }</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; print &quot;Outside If\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; }</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; # Any complete requests to process ?</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; foreach $client (keys %ready) {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; print &quot;Handling a request\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; handle($client);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; }</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">&nbsp; # Buffers to flush ?</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; foreach $client ($select-&gt;can_write(1)) {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; print &quot;Flushing the buffers\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; #next unless exists $outbuffer{$client};</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; print &quot;Sending information to the outbuffer\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; $rv = $client-&gt;send($outbuffer{$client}, 0);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; unless (defined $rv) {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; warn &quot;I can't write\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; }</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; print &quot;Reading the length of the outbuffer\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; if ($rv == length $outbuffer{$client} ||</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; $! == POSIX::EWOULDBLOCK) {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;Doing some stuff with the outbuffer\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; substr($outbuffer{$client}, 0 , $rv) = '';</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete $outbuffer{$client} unless length $outbuffer{$client};</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; }</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; else {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;Cleaning up the flush buffers\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete $inbuffer{$client};</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete $outbuffer{$client};</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete $read{$client};</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select-&gt;remove($client);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close($client);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; }</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; print &quot;Leaving Flush Buffers\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; #$select-&gt;remove($client);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; #close $client;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; }</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; print &quot;Leaving the Listener\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; #close $client or die &quot;Can't close ($!)\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">} die &quot;Can't accept socket ($!)\n&quot;;</FONT>
</P>
<BR>

<P><FONT SIZE=2 FACE="Arial">sub Generate_ReqId($Rid) {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; $ReqId++;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; return $ReqId;</FONT>

<BR><FONT SIZE=2 FACE="Arial">}</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">sub handle {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; my $client = shift;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; print &quot;Inside the Handle sub $client\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; my $request;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; foreach $request (@{$ready{$client}}) {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; print &quot;Inside the request for loop $request\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; # put the text of reply into the $outbuffer{$client}</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; $outbuffer{$client} .= $request;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; $packet = $outbuffer{$client};</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; print &quot;Packet is $outbuffer{$client}\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; }</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; delete $ready{$client};</FONT>

<BR><FONT SIZE=2 FACE="Arial">}</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">sub process_connection {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; print &quot;Inside process_connection\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; #print $client &quot;$.: $_&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; $CoreReqId = &quot;&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; $ReqType = &quot;&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; $CNNum = &quot;&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; $ProjId = &quot;&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; $CdPack = &quot;&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; $CdPackLoc = &quot;&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; #my $ClientName = gethostbyaddr($socket-&gt;peeraddr, AF_INET);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; #my $port = $socket-&gt;peerport;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; #print &quot;[$ClientName $port]\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; # Once a client has been accepted, print out the client information and the packet it sent</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; while (&lt;$client&gt;) {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; $packetname = $_;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; print &quot;Packet is $_\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; #print &quot;[$ClientName $port] $_&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; #print $client &quot;$.: $_&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; # Parse the packet</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; # NOTE: Don't chop the packet.&nbsp; The return character needs to remain imbedded in</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; # the packet to return back to the client</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; ($CoreRegId,$ReqType,$CNNum,$ProjId,$CdPack,$CdPackLoc) = split(/\|/,$packetname);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; print &quot;$CoreReqId, $ReqType $CNNum $ProjId $CdPack $CdPackLoc\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; # Chop the last entry of the split string and join the CdPackLoc with CdPack</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; chop $CdPackLoc;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; $NewElement = $CdPackLoc.$CdPack;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; #$EndTime = `echo %time%`;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; #print &quot;End Time = $EndTime\n&quot;;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; $select-&gt;remove($client);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; $client-&gt;close;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; }</FONT>

<BR><FONT SIZE=2 FACE="Arial">}</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">The programmer for the Black Box side assures me that he is not putting any special end-of-line characters in his output string.&nbsp; I'm at a total loss for what is going on here. Any help would be appreciated.</FONT></P>

<P><FONT SIZE=2 FACE="Arial">Thanks,</FONT>
</P>

<P><FONT SIZE=2 FACE="Courier">Paul Krcma</FONT>

<BR><FONT SIZE=2 FACE="Courier">CMI Client/Server (EISS)</FONT>

<BR><FONT SIZE=2 FACE="Courier">612-316-3712</FONT>
</P>

</BODY>
</HTML>