Thank you Vibhu

That is exactly what I came up with, and it seems to work decently well.
Only thing, I put a non-zero timeout.

All the best

Marco

On Thu, Dec 18, 2025 at 10:18 AM Vibhu Mohindra <[email protected]>
wrote:

> -------- Forwarded Message --------
> Subject: Re: READ-SEQUENCE and USOCKET
> Date: Thu, 18 Dec 2025 10:14:57 +0100
> From: Vibhu Mohindra <[email protected]>
> To: [email protected]
>
> How are you doing Marco?
>
> I'm looking at usocket-0.8.4. It may be worth exploring some of these
> aspects I see in its code:
> 1. option.lisp allows: (setf (socket-option mysocket :receive-timeout) ...)
> 2. usocket.lisp defines a generic socket-receive. It's only implemented
> for
> UDP sockets but I don't see why it shouldn't be implementable for
> stream-sockets too.
>
> Otherwise I don't see a better solution in usocket than inefficiently
> checking for and reading a byte at a time, like this.
>
> (defun read-available-vector (vector socket &key (start 0) (end nil))
>    "Reads whatever is presently available in SOCKET without hanging.
>     SOCKET and VECTOR are assumed to have elts of type (unsigned-byte 8).
>     Returns first unwritten position in VECTOR and whether at end-of-file."
>    (when (null end) (setq end (length vector)))
>    (assert (<= 0 start end (length vector)))
>    (flet ((socket-readyp ()
>             (wait-for-input socket :timeout 0 :ready-only t)))
>      (do ((i start (1+ i)))
>          ((or (>= i end) (not (socket-readyp)))
>           (values i nil))
>        (let ((b (read-byte (socket-stream stream) nil nil)))
>          (unless b (return (values i t)))
>          (setf (aref vector i) b)))))
>
> --
> Vibhu
>


-- 
Marco Antoniotti, Professor, Director         tel. +39 - 02 64 48 79 01
DISCo, University of Milan-Bicocca U14 2043   http://dcb.disco.unimib.it
Viale Sarca 336
I-20126 Milan (MI) ITALY

REGAINS: https://regains.disco.unimib.it/

Reply via email to