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