[Openmcl-devel] Read all available input from socket stream?

Gary Byers gb at clozure.com
Wed Jul 24 04:31:59 PDT 2013

Here's a very simple test case that tries to do something similar to
what your code is apparently trying to do.
(defun server ()
   (let* ((lsock (make-socket :connect :passive :local-host "localhost" :local-port 40000 :reuse-address t))
          (data (make-array 10 :element-type '(unsigned-byte 8))))
     (dotimes (i 10) (setf (aref data i) i))
     (let* ((stream (accept-connection lsock :wait t)))
       (write-sequence data stream)
       (when t
         (sleep 5)
         (write-sequence data stream))
       (close stream)
       (close lsock))))

(defun test ()
   (process-run-function "server" #'server)
   (let* ((stream (make-socket :remote-host "localhost" :remote-port 40000))
          (data (make-array 19 :element-type '(unsigned-byte 8)))
          (n (read-sequence data stream)))
     (close stream)
     (format t "~& requested 19 octets, got ~d" n)))

Calling (TEST) shoud pause for ~5 seconds, then report that it requested
and go 19 octets.  Does this fail for you ?  If not, how does the code
that you're dealing with differ ?

If you change the WHEN T in #'SERVER to WHEN NIL (and wait a few minutes,
since I'm likely not using :reuse-address correctly), the server will close
its side of the connection after writing 10 octets; READ-SEQUENCE will see
that the stream is at EOF after those 10 octets are read.  This (EOF) is the
only situation in which READ-SEQUENCE should return prematurely, and it's the
only situation I'm aware of in which it does so in CCL.

On Tue, 23 Jul 2013, Joshua Kordani wrote:

> Greetings all.
> I am attempting to read all currently available data from a stream.? I am
> not expecting much data, so I suspect I need to call finish-output.? (read)
> seems to return immediately, before it seems that data is available.? I
> guess in hindsight I don't know how the implementation is supposed to know
> when input has stopped coming in on what is conceptually a stream with no
> eof representing any termination of input.
> I guess what I'm saying is, given a socket stream, is there a way to read,
> blocking until there is input to be read and until there is no more data to
> be read, this kind of stream?
> http://paste.lisp.org/+2YLT
> this is a paste of the funciton I'm trying to get working.? I want to write
> something to the stream, and I expect something back, which I want to either
> return from this function or simply emit to *terminal-io*
> Josh

More information about the Openmcl-devel mailing list