Alejandro Santillan wrote:

>>Alejandro Santillan wrote:
>>
>>
>>>Bill, I was using your solution successfully to read several messages
> 
> sent
> 
>>>by the server, but when trying to work some request,
>>>which had a longer answer, your buffer only gets:
>>
>>...
>>
>>>How could I modify your routine, which is the following:
>>>
>>>my $buffer;
>>>my $bytes = sysread ($handle, $buffer, 1024);
>>>if (not defined $bytes or $bytes < 0) {
>>>#err
>>>print "error!!!";
>>>} elsif ($bytes == 0) {
>>># EOF
>>>}
>>>return $buffer;
>>>
>>>In order to get the full answer and avoid the program to hang.
>>
>>1) Increase the size of the read to more than 1024.
>>2) Optionally add a print on the error and EOF lines and return
>>-1 and 0 to the caller to indicate err and EOF.  Test for those
>>two conditions in the calling code and handle them accordingly
>>(at least indicate to the user what happened with a diagnostic
>>message).
>>3) Before doing the next read, make sure you do a select on the
>>socket to make sure that data is available.
>>4) Since the data in the buffer is in a stream, you will need to
>>find where each record begins and ends and possibly concatenate
>>data from two reads to complete a single record when the record
>>spans the read boundary.
> 
> 
> It seems that increasing the buffer more thant 1024 didn't help in all
> cases. It seems that this stream of data comes in several packets and the
> terminator string is !END!
> I've tried reading one byte at a time, using an $i as offset, and checking
> whenever the END pattern showed up
> 
> my $buffer;
> $i=1;
> while($buffercomplete=~/END/){

Don't you want !~ instead of =~ ?

> $bytes = sysread ($handle, $buffer, 1,$i);
> $buffercomplete=$buffercomplete.$buffer;
> $i++;
> }
> return $buffer;
> 
> but it doesn't read a line,

What is in $i after the read ?  What should it be ?

> whereas:
> 
>>>my $buffer;
>>>my $bytes = sysread ($handle, $buffer, 1024);
>>>if (not defined $bytes or $bytes < 0) {
>>>#err
>>>print "error!!!";
>>>} elsif ($bytes == 0) {
>>># EOF
>>>}
>>>return $buffer;
> 
> does read seven lines, and increasing the 1024 to 8192 the reading is the
> same, and it does not include the !END! pattern

I don't follow what you're saying here.  If you're not getting the
EOR indicator, try a bigger read or read a second time if you don't
get it in the first buffer.  Do a select before the read if you
don't want to block.  How much data do you get on the first read ?
How big is the full record supposed to be ?

Please don't CC me on your replies.

_______________________________________________
Perl-Win32-Users mailing list
Perl-Win32-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs

Reply via email to