net-receive has not one timeout argument. When will it return if no data is sent by remote peer?
And another question, is it possible to set the timeout now?
I write some codes for solving this problem:
;; socket.lsp
(context 'socket)
;; return the number of bytes which are ready to read
;; throw error if connection is closed
(define (net-peek-ex s)
(unless (net-peek s)
(throw-error "connection is closed")))
;; read specified size of data from connection in specified milliseconds
;; s means socket
;; timeout means waiting for milliseconds
;; return the receivied data
;; return () if timeout
(define (read-data s timeout number)
(let ((t (time-of-day)) (r 0))
(catch
(while true
(begin
(sleep 1)
(set 'r (net-peek-ex s))
(if (> r 0) (throw r))
(if (> (- (time-of-day) t) timeout) (throw -1))
)) 'q)
(if (!= -1 q)
(begin (net-receive s buffer (min q number)) buffer)
'()
)))
(define (test)
;;(set 's (net-connect "localhost" 7777))
(set 's (net-connect "www.baidu.com" 80))
(let (x (read-data s 50 10 buff))
(if x (println x) (println "nil:" x))
))
(= -1 q)
to
(> (int q) -1)
because
(throw-error "connection is closed")
What's your point?
my codes is
(if (!= -1 q)
r is a string "'connection is closed" "when socket been closed by romote.
Then expr "(min q number)" will broke .
you are right. Thank you.