commit affefbc60cb38d935cfbf9d27fbf602d6ce02865
parent 61c7ed4988beaf4188f8df6555577f95780d0fb9
Author: Tomas Hlavaty <tom@logand.com>
Date: Fri, 18 Apr 2014 09:03:18 +0200
improve rw.socket and port to ecl
Diffstat:
3 files changed, 33 insertions(+), 12 deletions(-)
diff --git a/cl-rw.asd b/cl-rw.asd
@@ -33,7 +33,7 @@
:author "Tomas Hlavaty"
:maintainer "Tomas Hlavaty"
:licence "MIT"
- :depends-on (#+sbcl :sb-concurrency)
+ :depends-on (#+sbcl :sb-concurrency #+(or sbcl ecl) :sb-bsd-sockets)
:serial t
:components ((:file "rw")
(:file "filesystem")
diff --git a/http.lisp b/http.lisp
@@ -122,7 +122,7 @@
(string (rw.uri:parse url)))
(declare (ignore fragment))
(assert (equal "http" scheme))
- (with-open-stream (s (rw.socket:make-active-tcp-socket host (or port 80)))
+ (with-open-stream (s (rw.socket:make-tcp-client-socket host (or port 80)))
(write-query s :get :http-1.0 path query-string)
(write-headers (or headers
`(("Host" . ,(if port
@@ -350,7 +350,7 @@
;; TODO also thread limit
;; TODO also thread pool
(defun server (host port handler &key quit)
- (let ((s (rw.socket:make-passive-tcp-socket host port)))
+ (let ((s (rw.socket:make-tcp-server-socket host port)))
(rw.concurrency:make-thread
(format nil "RW.HTTP:SERVER-LOOP ~s ~s" host port)
(lambda ()
diff --git a/socket.lisp b/socket.lisp
@@ -1,14 +1,23 @@
(defpackage :rw.socket
(:use :cl)
(:export :accept
- :make-passive-tcp-socket
- :make-active-tcp-socket))
+ :make-tcp-server-socket
+ :make-tcp-client-socket))
(in-package :rw.socket)
-(defun make-passive-tcp-socket (host port)
- #-ccl
- (error "TODO port RW.SOCKET:MAKE-PASSIVE-TCP-SOCKET")
+(defun make-tcp-server-socket (host port &key backlog)
+ #-(or sbcl ecl ccl)
+ (error "TODO port RW.SOCKET:MAKE-TCP-SERVER-SOCKET")
+ #+(or sbcl ecl)
+ (let ((x (make-instance 'sb-bsd-sockets:inet-socket :type :stream :protocol :tcp)))
+ (setf (sb-bsd-sockets:sockopt-reuse-address x) t)
+ (sb-bsd-sockets:socket-bind x
+ (car (sb-bsd-sockets:host-ent-addresses
+ (sb-bsd-sockets:get-host-by-name host)))
+ port)
+ (sb-bsd-sockets:socket-listen x (or backlog 5))
+ x)
#+ccl
(ccl:make-socket :connect :passive
:address-family :internet
@@ -18,9 +27,16 @@
:local-port port
:reuse-address t))
-(defun make-active-tcp-socket (host port)
- #-ccl
- (error "TODO port RW.SOCKET:MAKE-ACTIVE-TCP-SOCKET")
+(defun make-tcp-client-socket (host port)
+ #-(or sbcl ecl ccl)
+ (error "TODO port RW.SOCKET:MAKE-TCP-CLIENT-SOCKET")
+ #+(or sbcl ecl)
+ (let ((x (make-instance 'sb-bsd-sockets:inet-socket :type :stream :protocol :tcp)))
+ (sb-bsd-sockets:socket-connect x
+ (car (sb-bsd-sockets:host-ent-addresses
+ (sb-bsd-sockets:get-host-by-name host)))
+ port)
+ x)
#+ccl
(ccl:make-socket :connect :active
:address-family :internet
@@ -59,7 +75,12 @@
;; fd
(defun accept (socket)
- #-ccl
+ #-(or sbcl ecl ccl)
(error "TODO port RW.SOCKET:ACCEPT")
+ #+(or sbcl ecl)
+ (sb-bsd-sockets:socket-make-stream (sb-bsd-sockets:socket-accept socket)
+ :input t
+ :output t
+ :auto-close t)
#+ccl
(ccl:accept-connection socket))