[fpc-pascal] fpselect does not work on linux
fpclist at silvermono.co.za
fpclist at silvermono.co.za
Sat May 9 12:51:14 CEST 2009
According to the FPC rtl.pdf version 2.2.2 Doc version 2.1 of June 2008, page
165, states, and I quote: "Description:FPSelect checks one of the file
descriptors in the FDSets to see if its status changed."
//-------------------------------------------------------------------------
On Saturday 09 May 2009 12:50:03 Michael Van Canneyt wrote:
> On Sat, 9 May 2009, Rainer Stratmann wrote:
> > Am Samstag, 9. Mai 2009 12:17 schrieb Michael Van Canneyt:
> > > On Sat, 9 May 2009, Rainer Stratmann wrote:
> > > > To find out if a nonblocking socket has connected I use the following
> > > > piece of code:
> > > >
> > > > With windows that works, but with linux I get alwas the result that
> > > > the socket is writable.
> > > >
> > > > function is_writable_socket( sck : integer ) : boolean;
> > > > var
> > > > fds : tfdset;
> > > > tv : timeval;
> > > > begin
> > > > {$ifdef linux} fpfd_zero( fds ); fpfd_set( sck , fds ); {$endif}
> > > > {$ifdef windows} fd_zero( fds ); fd_set( sck , fds ); {$endif}
> > > > tv.tv_sec := 0;
> > > > tv.tv_usec := 0;
> > > > // socket+1 , read , write , except , timeout
> > > > {$ifdef linux}
> > > > result := fpselect( sck + 1 , nil , @fds , nil , @tv ) > 0;
> > > > {$else}
> > > > result := select( sck + 1 , nil , @fds , nil , @tv ) > 0;
> > > > {$endif}
> > > > end;
> > >
> > > And why do you think that this is a bug ?
> >
> > I know that the socket I tested is not writable, but the function returns
> > writable... always with linux.
> >
> > It is not working on linux operating system. With windows os that works.
> >
> > Someone else have (had?) exactly the same problem:
> > http://community.freepascal.org:10000/bboards/message?message_id=270583&f
> >orum_id=24083
>
> The call functions correctly, IMHO, but the behaviour of the call is not as
> you expect.
>
> Select does *not* tell you if a file descriptor is writeable or readable.
> It tells you if the read/write operation will block.
> This is something subtly different.
>
> For instance, it reports file descriptor 0 as writable, which is rather
> strange, since it is read-only, but correct, because the write call will
> not block. Indeed the write call will return at once with an error
> condition.
>
> This is what the kernel sees (I used strace to test your code with
> descriptor 0):
>
> select(1, NULL, [0], NULL, {0, 0}) = 1 (out [0], left {0, 0})
>
> Which is exactly what I sent.
>
> In short, is_writable_socket should be implemented differently, not using
> select.
>
> Michael.
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
More information about the fpc-pascal
mailing list