[Openmcl-devel] Transfer the contents of a file to a tcp stream

Christian Nybø chr at nybo.no
Fri May 13 07:58:14 UTC 2005


On May 5, 2005, at 22:55, Gary Byers wrote:
> Maybe something like:
>
> (let* ((bufsize 8192))
>   (ccl::%stack-block ((buf bufsize)
>                       (iovec (* 4 (ccl::record-length :iovec))))
>     ;; Set up each element of the iovec array to point at 1/4 of the
>     ;; buffer.
>     (dotimes (i 4)
>       (with-macptrs ((p (%inc-ptr iovec (* i (ccl::record-length 
> :iovec)))))
>         (setf (pref p :iovec.iov_base) (%inc-ptr buf (* i 2048))
>               (pref p :iovec.iov_len) 2048)))
>     ...
>     (loop
>       (let* ((nread (#_read file-fd buf bufsize)))
>         ((cond ((= nread bufsize)
>                 ;; Got a full buffer, write to socket via #_writev
>                 (#_writev socket-fd iovec 4))
>                ((> nread 0)
>                 ;; Got less than a full buffer.  Either adjust
>                 ;; the count of iovecs/the iov_len of the last one,
>                 ;; or just do a single #_write as before.
>                )
>                ((= nread 0) (return))
>                (t (error ...))))))))

I wrapped the writev that is called when (= nread bufsize) in a loop.  
It gets stuck quite often - the errno is -35, whose strerror is 
"Resource temporarily unavailable."
What should the program do when writev returns -35?
-- 
chr




More information about the Openmcl-devel mailing list