Added a tcp-connect-nonblocking-example.ss to demonstrate how to

handle nonblocking sockets by continuous polling.
This commit is contained in:
Abdulaziz Ghuloum 2007-12-27 22:17:54 -05:00
parent 64dac92831
commit 4c3b17436f
3 changed files with 34 additions and 2 deletions

View File

@ -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")

View File

@ -1 +1 @@
1293
1294

View File

@ -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]
))