Hi, Nikodemus Thanks very much, your code give me a very good "template".
I think maybe such code should live outside of USOCKET library itself, because the connection logic various among different applications. For example, suppose there's a hostname which can be resolved into more than 10 different addresses, but the network application want to try at most 3 of those addresses before signal a error. (the theory may be this: if 3 of 10 was down, all was down, no time waste to try the other 7) So, my job (as a USOCKET maintainer) is to make sure SOCKET-CONNECT on all supported CL platforms could report the same USOCKET-defined error type (i.e. USOCKET:CONNECTION-REFUSED-ERROR), so that something like following code could be written in user code: (defun socket-connect-2 (host port) (let ((addresses (usocket::get-hosts-by-name host))) (tagbody :connect (let ((address (pop addresses))) (handler-bind ((usocket:connection-refused-error #'(lambda (c) (declare (ignore c)) (when addresses (go :connect))))) (usocket:socket-connect address port)))))) Regards, Chun Tian (binghe) 在 2011-3-17,16:02, Nikodemus Siivola 写道: > Here's what I would consider one idiomatic way to try all addresses on > using SB-BSD-SOCKETS. > > (defun connect-to-host (socket host port) > (let ((addresses (host-ent-addresses (get-host-by-name host)))) > (tagbody > :connect > (let ((addr (pop addresses))) > (handler-bind ((socket-error > (lambda (e) (when addresses (go :connect))))) > (socket-connect socket addr port)))))) > > Cheers, > > -- Nikodemus _______________________________________________ usocket-devel mailing list usocket-devel@common-lisp.net http://common-lisp.net/cgi-bin/mailman/listinfo/usocket-devel