[MPlayer-dev-eng] [PATCH] fix premature end of stream download

trevor-b at ovi.com trevor-b at ovi.com
Fri Mar 23 23:12:30 CET 2012


> ... when recv returns 0, the other side closed the connection.
what if recv returns < 0?  In my case, the call to perror prints "read error:: Resource temporarily unavailable"


> recv is not allowed to return EAGAIN

Are you sure? Perhaps this is a windows vs linux/unix/posix difference?

This is taken from the man page for recv ....

ERRORS
       These  are  some  standard  errors  generated  by  the socket layer.  Additional errors may be generated and
       returned from the underlying protocol modules; see their manual pages.

       EAGAIN or EWOULDBLOCK
              The socket is marked nonblocking and the receive operation would block, or a receive timeout had been
              set  and  the  timeout  expired  before  data  was  received.  POSIX.1-2001 allows either error to be
              returned for this case, and does not require these constants to have the same value,  so  a  portable
              application should check for both possibilities.

...




----- Original Message -----
> From: Reimar Döffinger <Reimar.Doeffinger at gmx.de>
> To: mplayer-dev-eng at mplayerhq.hu
> Cc: 
> Sent: Friday, 23 March 2012, 17:29
> Subject: Re: [MPlayer-dev-eng] [PATCH] fix premature end of stream download
> 
> On Fri, Mar 23, 2012 at 09:59:17AM -0700, trevor-b at ovi.com wrote:
>>  Hi all,
>> 
>>  I have been listening to a BBC program, but mplayer nearly always aborts 
> before finishing the download with this error message:
>> 
>>      read error:: Resource temporarily unavailable3% 1% 
>>      pre-header read failed
>>      Stream not seekable!
>> 
>>  In the sample output below, you can see the error occurred 11 mins into a 2 
> hr program.
>> 
>>  From the eror message, I'm guessing the problem happens because the 
> data doesn't arrive fast enough, 
>> 
>>  so mplayer gives up.
>> 
>>  The corresponding code is in stream/asf_mmst_streaming.c, in function 
> get_data():
>> 
>>      len = recv (s, &buf[total], count-total, 0);
>>      if (len<=0) {
>>        perror ("read error:");
>>        return 0;
>>      }
>> 
>> 
>>  So it does give up as soon as there is no data available.
> 
> No it does not, when recv returns 0, the other side closed the
> connection.
> 
> 
>>  --- stream/asf_mmst_streaming.c    2010-09-10 22:42:13.000000000 +0100
>>  +++ stream/asf_mmst_streaming.1.c    2012-03-22 22:51:36.000000000 +0000
>>  @@ -191,11 +191,14 @@
>>   {
>>     ssize_t  len;
>>     size_t total = 0;
>>  -
>>  +  int nr_tries;
>>>>     while (total < count) {
>>   
>>  -    len = recv (s, &buf[total], count-total, 0);
>>  -
>>  +    nr_tries = 10;
>>  +    do
>>  +        len = recv (s, &buf[total], count-total, 0);
>>  +    while( len == EAGAIN && nr_tries-- > 0 );
> 
> That doesn't make sense, recv is not allowed to return EAGAIN
> (-1, 0 and number of bytes are the only allowed values),
> thus either the recv implementation is broken or your
> change does not do anything at all.
> _______________________________________________
> MPlayer-dev-eng mailing list
> MPlayer-dev-eng at mplayerhq.hu
> https://lists.mplayerhq.hu/mailman/listinfo/mplayer-dev-eng
> 


More information about the MPlayer-dev-eng mailing list