Added a tcp-connect-nonblocking-example.ss to demonstrate how to
handle nonblocking sockets by continuous polling.
This commit is contained in:
parent
64dac92831
commit
4c3b17436f
|
@ -0,0 +1,32 @@
|
|||
#!/usr/bin/env scheme-script
|
||||
|
||||
(import (ikarus))
|
||||
|
||||
;;; very simple demo for how to connect to a server,
|
||||
;;; send a request and receive a response.
|
||||
|
||||
;;; Here, we use an asynchronous IO socket. We wrap the whole
|
||||
;;; operation with an exception handler to handle the would-block
|
||||
;;; conditions. If we do get a would-block condition, we just
|
||||
;;; return, causing the read/write operation to be restarted until
|
||||
;;; it succeeds. Pretty lame at this point, but it works.
|
||||
|
||||
(define (http-cat host)
|
||||
(with-exception-handler
|
||||
(lambda (c)
|
||||
;;; just return and let it retry until it succeeds
|
||||
(unless (i/o-would-block-condition? c)
|
||||
(raise c)))
|
||||
(lambda ()
|
||||
(let-values ([(op ip) (tcp-connect-nonblocking host "http")])
|
||||
(let ([op (transcoded-port op (native-transcoder))]
|
||||
[ip (transcoded-port ip (native-transcoder))])
|
||||
(display "GET /\n" op)
|
||||
(display (get-string-all ip))
|
||||
(close-input-port ip)
|
||||
(close-output-port op))))))
|
||||
|
||||
(http-cat "www.google.com")
|
||||
(newline)
|
||||
;(http-cat "127.0.0.1")
|
||||
|
|
@ -1 +1 @@
|
|||
1293
|
||||
1294
|
||||
|
|
|
@ -1380,7 +1380,7 @@
|
|||
[tcp-connect-nonblocking i]
|
||||
[&i/o-would-block i]
|
||||
[make-i/o-would-block-condition i]
|
||||
[i/o-would-block-condition i]
|
||||
[i/o-would-block-condition? i]
|
||||
[i/o-would-block-port i]
|
||||
))
|
||||
|
||||
|
|
Loading…
Reference in New Issue