newLISP Fan Club

Forum => newLISP in the real world => Topic started by: csfreebird on April 20, 2013, 02:47:28 AM

Title: timeout question about net-receive
Post by: csfreebird on April 20, 2013, 02:47:28 AM
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?
Title: Re: timeout question about net-receive
Post by: csfreebird on April 28, 2013, 05:14:43 AM
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))
  ))
Title: Re: timeout question about net-receive
Post by: winger on April 28, 2013, 09:40:57 PM
(= -1 q)
to
(> (int q) -1)

because
(throw-error "connection is closed")
Title: Re: timeout question about net-receive
Post by: csfreebird on April 28, 2013, 10:08:09 PM
What's your point?

my codes is

   (if (!= -1 q)
Title: Re: timeout question about net-receive
Post by: winger on May 04, 2013, 11:06:20 AM
r is a string "'connection is closed" "when socket been closed by romote.

Then  expr "(min q number)" will broke .
Title: Re: timeout question about net-receive
Post by: csfreebird on May 06, 2013, 09:19:28 PM
you are right. Thank you.