M2Crypto: select() behaves weird on SSL socket

Donn Cave donn at drizzle.com
Mon Jun 10 22:34:58 EDT 2002


Quoth Irmen de Jong <irmen at NOSPAMREMOVETHISxs4all.nl>:
...
| The manual page of select(2) says:
| "select  waits  for  a number of file descriptors to change status.
|   Three independent sets of descriptors are watched.   Those
|   listed  in  readfds  will  be watched to see if characters
|   become available for reading (more precisely, to see if  a
|   read  will not block - in particular, a file descriptor is
|   also ready on end-of-file),  those  in  writefds  will  be
|   watched  to  see  if  a write will not block, and those in
|   exceptfds will be watched for exceptions."
|
| The way I interpret this is that -buffering or not- select must
| return a FD if there is more data available. In my case, the SSL
| socket indeed has more data available, and a recv() on the socket
| will not block. I therefore think that either M2Crypto or OpenSSL
| is doing the wrong thing because select() doesn't behave as it should?
| The recv() may read from a buffer, I don't care, but it doesn't
| block on my next call and thus I expect select() to return the socket
| as being ready for reading... am I wrong here?

Wrong, I'd say.  SSL's buffer, like the file object's stdio buffer,
is user process storage.  From select's point of view (the low level
device) you have already read that data, and it doesn't know or care
what you did with it.

I see my reply earlier today followed up a separate thread, after
you posted your initial question twice.  If you haven't seen it,
a hint:  SSL_pending(self->ssl.)  (I don't know much more than that,
anyway.)

	Donn Cave, donn at drizzle.com



More information about the Python-list mailing list