[usocket-cvs] r623 - usocket/branches/0.5.x/backend

Chun Tian (binghe) ctian at common-lisp.net
Thu Mar 31 12:32:56 UTC 2011


Author: ctian
Date: Thu Mar 31 08:32:56 2011
New Revision: 623

Log:
[CLISP] fixed SOCKET-SEND & SOCKET-RECEIVE for handling any data, confirmed by CL-NET-SNMP

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	Thu Mar 31 08:32:56 2011
@@ -233,10 +233,6 @@
   (defmethod socket-receive ((socket datagram-usocket) buffer length &key)
     "Returns the buffer, the number of octets copied into the buffer (received)
 and the address of the sender as values."
-    (declare (values (simple-array (unsigned-byte 8) (*)) ; buffer
-		     (integer 0)                          ; size
-		     (unsigned-byte 32)                   ; host
-		     (unsigned-byte 16)))                 ; port
     (let* ((sock (socket socket))
            (sockaddr (unless (connected-p socket)
                        (rawsock:make-sockaddr :inet)))
@@ -311,9 +307,7 @@
   ;; foreign functions
   (ffi:def-call-out %sendto (:name "sendto")
     (:arguments (socket ffi:int)
-		(buffer (ffi:c-ptr (ffi:c-array-max ffi:uint8
-						    #.+max-datagram-packet-size+))
-			:in)
+		(buffer ffi:c-pointer)
 		(length ffi:int)
 		(flags ffi:int)
 		(address (ffi:c-ptr sockaddr))
@@ -326,9 +320,7 @@
 
   (ffi:def-call-out %send (:name "send")
     (:arguments (socket ffi:int)
-		(buffer (ffi:c-ptr (ffi:c-array-max ffi:uint8
-						    #.+max-datagram-packet-size+))
-			:in)
+		(buffer ffi:c-pointer)
 		(length ffi:int)
 		(flags ffi:int))
     #+win32 (:library "WS2_32")
@@ -339,9 +331,7 @@
 
   (ffi:def-call-out %recvfrom (:name "recvfrom")
     (:arguments (socket ffi:int)
-		(buffer (ffi:c-ptr (ffi:c-array-max ffi:uint8
-						    #.+max-datagram-packet-size+))
-			:in-out)
+		(buffer ffi:c-pointer)
 		(length ffi:int)
 		(flags ffi:int)
 		(address (ffi:c-ptr sockaddr) :in-out)
@@ -509,35 +499,31 @@
       (zerop (%close socket))))
 
   (defmethod socket-receive ((usocket datagram-usocket) buffer length &key)
-    (declare (values (simple-array (unsigned-byte 8) (*)) ; buffer
-		     (integer 0)                          ; size
-		     (unsigned-byte 32)                   ; host
-		     (unsigned-byte 16)))                 ; port
     (let ((remote-address (ffi:allocate-shallow 'sockaddr_in))
 	  (remote-address-length (ffi:allocate-shallow 'ffi:int))
 	  nbytes (host 0) (port 0))
       (setf (ffi:foreign-value remote-address-length)
 	    *length-of-sockaddr_in*)
       (unwind-protect
-	   (multiple-value-bind (n return-buffer address address-length)
+	   (multiple-value-bind (n address address-length)
 	       (%recvfrom (socket usocket)
-			  (ffi:foreign-value (slot-value usocket 'recv-buffer))
+			  (ffi:foreign-address (slot-value usocket 'recv-buffer))
 			  +max-datagram-packet-size+
 			  0 ; flags
 			  (ffi:cast (ffi:foreign-value remote-address) 'sockaddr)
 			  (ffi:foreign-value remote-address-length))
-	     (assert (= n (length return-buffer)))
 	     (setq nbytes n)
 	     (when (= address-length *length-of-sockaddr_in*)
 	       (let ((data (sockaddr-sa_data address)))
 		 (setq host (ip-from-octet-buffer data :start 2)
 		       port (port-from-octet-buffer data))))
 	     (cond ((plusp n)
-		    (if buffer ; replace exist buffer of create new return buffer
-			(let ((end-1 (min (or length (length buffer)) +max-datagram-packet-size+))
-			      (end-2 (min n +max-datagram-packet-size+)))
-			  (replace buffer return-buffer :end1 end-1 :end2 end-2))
-			(setq buffer (subseq return-buffer 0 (min n +max-datagram-packet-size+)))))
+		    (let ((return-buffer (ffi:foreign-value (slot-value usocket 'recv-buffer))))
+		      (if buffer ; replace exist buffer of create new return buffer
+			  (let ((end-1 (min (or length (length buffer)) +max-datagram-packet-size+))
+				(end-2 (min n +max-datagram-packet-size+)))
+			    (replace buffer return-buffer :end1 end-1 :end2 end-2))
+			  (setq buffer (subseq return-buffer 0 (min n +max-datagram-packet-size+))))))
 		   ((zerop n)) ; do nothing
 		   (t))) ; TODO: handle error here.
 	(ffi:foreign-free remote-address)
@@ -564,12 +550,13 @@
       (unwind-protect
 	   (let ((n (if remote-address
 			(%sendto (socket usocket)
-				 (ffi:foreign-value send-buffer)
+				 (ffi:foreign-address send-buffer)
 				 (min length +max-datagram-packet-size+) 0
 				 (ffi:cast (ffi:foreign-value remote-address) 'sockaddr)
 				 *length-of-sockaddr_in*)
 			(%send (socket usocket)
-			       (ffi:foreign-value send-buffer)
+			       ;; (ffi:cast (ffi:foreign-value send-buffer) 'ffi:c-pointer)
+			       (ffi:foreign-address send-buffer)
 			       (min length +max-datagram-packet-size+) 0))))
 	     (cond ((plusp n)
 		    (setq nbytes n))




More information about the usocket-cvs mailing list