Grant Edwards wrote:
> Laszlo Nagy wrote:
>> What about non-blocking sockets?
> 
> $ man recv
> ...
>        If no messages are available at the socket, the receive
>        calls wait for a message to arrive, unless the socket is
>        non-blocking (see fcntl(2)), in which case the value -1
>        is returned and the external variable errno set to
>        EAGAIN.

As Grant showed, a successful recv() returning zero bytes
indicates the end of the data stream from the remote peer.
Other cases block or raise errors.

A few more notes:

When a socket will return zero bytes to indicate the end of the
data stream, it will select() as readable.

In the case Laszlo asked about here -- a non-blocking socket
is not shutdown but no data is immediately readable -- on some
systems, the error is EWOULDBLOCK, which may be, but is not
generally, the same code as EAGAIN. (There may be yet other
systems that have different error conventions; I don't know.)

The Python library's 'errno' module exports the error names with
their associated numeric values.

Python's socket module does not 'return' these error codes; it
raises exceptions. A non-blocking socket, or equivalently a
socket with a timeout of zero, will raise socket.error. The
errno in the exception's (errno, string) value should be
EAGAIN or EWOULDBLOCK.  If a socket has a non-zero timeout,
and that timeout expires, the operation raises socket.timeout.


-- 
--Bryan
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to