[usocket-devel] [usocket-cvs] r604 - usocket/branches/0.5.x/backend

Chun Tian (binghe) binghe.lisp at gmail.com
Wed Mar 30 02:15:19 UTC 2011


Hi, Erik

Thank you. And this is my plan:

I've fixed lots of bugs since 0.5.0, and I want to release 0.5.1 once the CLISP / FFI work is done.

And once 0.5.1 is out, I'll backport all changes on branch 0.5.x to trunk and start working on SOCKET-OPTION API on trunk, and once it's done again, consider this is new added API, I want to release 0.6.0, but the exact release date is unknown at this time.

--binghe

在 2011-3-30,03:50, Erik Huelsmann 写道:

> Hi Chun,
> 
> 
> Nice work (and great activity!).
> 
> Just a remark from personal experience: Don't forget to backport to
> trunk when you're working directly on the branch.
> 
> Bye,
> 
> Erik.
> 
> On Tue, Mar 29, 2011 at 7:04 PM, Chun Tian <ctian at common-lisp.net> wrote:
>> Author: ctian
>> Date: Tue Mar 29 13:04:30 2011
>> New Revision: 604
>> 
>> Log:
>> [CLISP] Fixed SOCKET-CONNECT / UDP for RAWSOCK; Basic FFI framework.
>> 
>> Modified:
>>   usocket/branches/0.5.x/backend/clisp.lisp
>> 
>> Modified: usocket/branches/0.5.x/backend/clisp.lisp
>> ==============================================================================
>> --- usocket/branches/0.5.x/backend/clisp.lisp   (original)
>> +++ usocket/branches/0.5.x/backend/clisp.lisp   Tue Mar 29 13:04:30 2011
>> @@ -5,9 +5,15 @@
>> 
>>  (in-package :usocket)
>> 
>> +(eval-when (:compile-toplevel :load-toplevel :execute)
>> +  #-ffi
>> +  (warn "This image doesn't contain FFI package, GET-HOST-NAME won't work.")
>> +  #-(or ffi rawsock)
>> +  (warn "This image doesn't contain either FFI or RAWSOCK package, no UDP support."))
>> +
>>  ;; utility routine for looking up the current host name
>>  #+ffi
>> -(FFI:DEF-CALL-OUT get-host-name-internal
>> +(ffi:def-call-out get-host-name-internal
>>          (:name "gethostname")
>>          (:arguments (name (FFI:C-PTR (FFI:C-ARRAY-MAX ffi:character 256))
>>                            :OUT :ALLOCA)
>> @@ -61,26 +67,36 @@
>>                        timeout deadline (nodelay t nodelay-specified)
>>                        local-host local-port)
>>   (declare (ignore nodelay))
>> -  (when timeout (unsupported 'timeout 'socket-connect))
>>   (when deadline (unsupported 'deadline 'socket-connect))
>>   (when nodelay-specified (unsupported 'nodelay 'socket-connect))
>>   (when local-host (unsupported 'local-host 'socket-connect))
>>   (when local-port (unsupported 'local-port 'socket-connect))
>> -
>> -  (let ((socket)
>> -        (hostname (host-to-hostname host)))
>> -    (with-mapped-conditions (socket)
>> -      (setf socket
>> -            (if timeout
>> -                (socket:socket-connect port hostname
>> -                                       :element-type element-type
>> -                                       :buffered t
>> -                                       :timeout timeout)
>> -                (socket:socket-connect port hostname
>> -                                       :element-type element-type
>> -                                       :buffered t))))
>> -    (make-stream-socket :socket socket
>> -                        :stream socket))) ;; the socket is a stream too
>> +  (case protocol
>> +    (:stream
>> +     (let ((socket)
>> +          (hostname (host-to-hostname host)))
>> +       (with-mapped-conditions (socket)
>> +        (setf socket
>> +              (if timeout
>> +                  (socket:socket-connect port hostname
>> +                                         :element-type element-type
>> +                                         :buffered t
>> +                                         :timeout timeout)
>> +                  (socket:socket-connect port hostname
>> +                                         :element-type element-type
>> +                                         :buffered t))))
>> +       (make-stream-socket :socket socket
>> +                          :stream socket))) ;; the socket is a stream too
>> +    (:datagram
>> +     #+rawsock
>> +     (socket-create-datagram (or local-port *auto-port*)
>> +                            :local-host (or local-host *wildcard-host*)
>> +                            :remote-host host
>> +                            :remote-port port)
>> +     #+(and ffi (not rawsock))
>> +     ()
>> +     #-(or rawsock ffi)
>> +     (unsupported '(protocol :datagram) 'socket-connect))))
>> 
>>  (defun socket-listen (host port
>>                            &key reuseaddress
>> @@ -146,7 +162,6 @@
>>  (defmethod get-peer-port ((usocket stream-usocket))
>>   (nth-value 1 (get-peer-name usocket)))
>> 
>> -
>>  (defun %setup-wait-list (wait-list)
>>   (declare (ignore wait-list)))
>> 
>> @@ -176,14 +191,12 @@
>>             (setf (state x) :READ)))
>>         wait-list))))
>> 
>> -
>> -;;
>> -;; UDP/Datagram sockets!
>> -;;
>> +;;;
>> +;;; UDP/Datagram sockets (RAWSOCK version)
>> +;;;
>> 
>>  #+rawsock
>>  (progn
>> -
>>   (defun make-sockaddr_in ()
>>     (make-array 16 :element-type '(unsigned-byte 8) :initial-element 0))
>> 
>> @@ -209,7 +222,7 @@
>>         (connect sock rsock_addr))
>>       (make-datagram-socket sock :connected-p (if rsock_addr t nil))))
>> 
>> -  (defun socket-receive (socket buffer &key (size (length buffer)))
>> +  (defun socket-receive (socket buffer length &key)
>>     "Returns the buffer, the number of octets copied into the buffer (received)
>>  and the address of the sender as values."
>>     (let* ((sock (socket socket))
>> @@ -218,44 +231,74 @@
>>            (rv (if sockaddr
>>                    (rawsock:recvfrom sock buffer sockaddr
>>                                      :start 0
>> -                                     :end size)
>> +                                     :end length)
>>                    (rawsock:recv sock buffer
>>                                  :start 0
>> -                                 :end size))))
>> +                                 :end length))))
>>       (values buffer
>>               rv
>> -              (list (ip-from-octet-buffer (sockaddr-data sockaddr) 4)
>> -                    (port-from-octet-buffer (sockaddr-data sockaddr) 2)))))
>> +              (ip-from-octet-buffer (sockaddr-data sockaddr) 4)
>> +              (port-from-octet-buffer (sockaddr-data sockaddr) 2))))
>> 
>> -  (defun socket-send (socket buffer &key address (size (length buffer)))
>> +  (defun socket-send (socket buffer length &key host port)
>>     "Returns the number of octets sent."
>>     (let* ((sock (socket socket))
>> -           (sockaddr (when address
>> +           (sockaddr (when (and host port)
>>                        (rawsock:make-sockaddr :INET
>>                                               (fill-sockaddr_in
>>                                                (make-sockaddr_in)
>> -                                               (host-byte-order
>> -                                                (second address))
>> -                                               (first address)))))
>> -           (rv (if address
>> +                                               (host-byte-order host)
>> +                                               port))))
>> +           (rv (if (and host port)
>>                    (rawsock:sendto sock buffer sockaddr
>>                                    :start 0
>> -                                   :end size)
>> +                                   :end length)
>>                    (rawsock:send sock buffer
>>                                  :start 0
>> -                                 :end size))))
>> +                                 :end length))))
>>       rv))
>> 
>>   (defmethod socket-close ((usocket datagram-usocket))
>>     (when (wait-list usocket)
>>        (remove-waiter (wait-list usocket) usocket))
>>     (rawsock:sock-close (socket usocket)))
>> -
>> -  )
>> +) ; progn
>> +
>> +;;;
>> +;;; UDP/Datagram sockets (FFI version)
>> +;;;
>> 
>> -#-rawsock
>> +#+(and ffi (not rawsock))
>>  (progn
>> -  (warn "This image doesn't contain the RAWSOCK package.
>> -To enable UDP socket support, please be sure to use the -Kfull parameter
>> -at startup, or to enable RAWSOCK support during compilation.")
>> -  )
>> +  (ffi:def-c-struct sockaddr
>> +    )
>> +
>> +  (ffi:def-c-struct sockaddr_in
>> +    )
>> +
>> +  (ffi:def-call-out %sendto (:name "sendto")
>> +    (:arguments (socket ffi:int)
>> +               (buffer (ffi:c-ptr ffi:uint8))
>> +               (length ffi:int)
>> +               (flags ffi:int)
>> +               (address (ffi:c-ptr sockaddr))
>> +               (address-len ffi:int))
>> +    #+win32 (:library "WS2_32")
>> +    #-win32 (:library :default)
>> +    (:language #-win32 :stdc
>> +              #+win32 :stdc-stdcall)
>> +    (:return-type ffi:int))
>> +
>> +  (ffi:def-call-out %recvfrom (:name "recvfrom")
>> +    (:arguments (socket ffi:int)
>> +               (buffer (ffi:c-ptr ffi:uint8) :out)
>> +               (length ffi:int)
>> +               (flags ffi:int)
>> +               (address (ffi:c-ptr sockaddr) :out)
>> +               (address-len (ffi:c-ptr ffi:int) :out))
>> +    #+win32 (:library "WS2_32")
>> +    #-win32 (:library :default)
>> +    (:language #-win32 :stdc
>> +              #+win32 :stdc-stdcall)
>> +    (:return-type ffi:int))
>> +) ; progn
>> 
>> _______________________________________________
>> usocket-cvs mailing list
>> usocket-cvs at common-lisp.net
>> http://common-lisp.net/cgi-bin/mailman/listinfo/usocket-cvs
>> 





More information about the usocket-devel mailing list