ttest-datagram.lisp - clic - Clic is an command line interactive client for gopher written in Common LISP (HTM) git clone git://bitreich.org/clic/ git://hg6vgqziawt5s4dj.onion/clic/ (DIR) Log (DIR) Files (DIR) Refs (DIR) Tags (DIR) LICENSE --- ttest-datagram.lisp (4727B) --- 1 ;;;; See LICENSE for licensing information. 2 3 (in-package :usocket-test) 4 5 (defvar *echo-server*) 6 (defvar *echo-server-port*) 7 8 (defun start-server () 9 (multiple-value-bind (thread socket) 10 (socket-server "127.0.0.1" 0 #'identity nil 11 :in-new-thread t 12 :protocol :datagram) 13 (setq *echo-server* thread 14 *echo-server-port* (get-local-port socket)))) 15 16 (defparameter *max-buffer-size* 32) 17 18 (defvar *send-buffer* 19 (make-array *max-buffer-size* :element-type '(unsigned-byte 8) :initial-element 0)) 20 21 (defvar *receive-buffer* 22 (make-array *max-buffer-size* :element-type '(unsigned-byte 8) :initial-element 0)) 23 24 (defun clean-buffers () 25 (fill *send-buffer* 0) 26 (fill *receive-buffer* 0)) 27 28 ;;; UDP Send Test #1: connected socket 29 (deftest udp-send.1 30 (progn 31 (unless (and *echo-server* *echo-server-port*) 32 (start-server)) 33 (let ((s (socket-connect "127.0.0.1" *echo-server-port* :protocol :datagram))) 34 (clean-buffers) 35 (replace *send-buffer* #(1 2 3 4 5)) 36 (socket-send s *send-buffer* 5) 37 (wait-for-input s :timeout 3) 38 (multiple-value-bind (buffer size host port) 39 (socket-receive s *receive-buffer* *max-buffer-size*) 40 (declare (ignore buffer size host port)) 41 (reduce #'+ *receive-buffer* :start 0 :end 5)))) 42 15) 43 44 ;;; UDP Send Test #2: unconnected socket 45 (deftest udp-send.2 46 (progn 47 (unless (and *echo-server* *echo-server-port*) 48 (start-server)) 49 (let ((s (socket-connect nil nil :protocol :datagram))) 50 (clean-buffers) 51 (replace *send-buffer* #(1 2 3 4 5)) 52 (socket-send s *send-buffer* 5 :host "127.0.0.1" :port *echo-server-port*) 53 (wait-for-input s :timeout 3) 54 (multiple-value-bind (buffer size host port) 55 (socket-receive s *receive-buffer* *max-buffer-size*) 56 (declare (ignore buffer size host port)) 57 (reduce #'+ *receive-buffer* :start 0 :end 5)))) 58 15) 59 60 (deftest mark-h-david ; Mark H. David's remarkable UDP test code 61 (let* ((host "localhost") 62 (port 1111) 63 (server-sock 64 (socket-connect nil nil :protocol ':datagram :local-host host :local-port port)) 65 (client-sock 66 (socket-connect host port :protocol ':datagram)) 67 (octet-vector 68 (make-array 2 :element-type '(unsigned-byte 8) :initial-contents `(,(char-code #\O) ,(char-code #\K)))) 69 (recv-octet-vector 70 (make-array 2 :element-type '(unsigned-byte 8)))) 71 (socket-send client-sock octet-vector 2) 72 (socket-receive server-sock recv-octet-vector 2) 73 (prog1 (and (equalp octet-vector recv-octet-vector) 74 recv-octet-vector) 75 (socket-close server-sock) 76 (socket-close client-sock))) 77 #(79 75)) 78 79 (deftest frank-james ; Frank James' test code for LispWorks/UDP 80 (with-caught-conditions (#+win32 CONNECTION-RESET-ERROR 81 #-win32 CONNECTION-REFUSED-ERROR 82 nil) 83 (let ((sock (socket-connect "localhost" 1234 84 :protocol ':datagram :element-type '(unsigned-byte 8)))) 85 (unwind-protect 86 (progn 87 (socket-send sock (make-array 16 :element-type '(unsigned-byte 8) :initial-element 0) 16) 88 (let ((buffer (make-array 16 :element-type '(unsigned-byte 8) :initial-element 0))) 89 (socket-receive sock buffer 16))) 90 (socket-close sock)))) 91 nil) 92 93 (defun frank-wfi-test () 94 (let ((s (socket-connect nil nil :protocol :datagram 95 :element-type '(unsigned-byte 8) 96 :local-port 8001))) 97 (unwind-protect 98 (do ((i 0 (1+ i)) 99 (buffer (make-array 1024 :element-type '(unsigned-byte 8) 100 :initial-element 0)) 101 (now (get-universal-time)) 102 (done nil)) 103 ((or done (= i 4)) 104 nil) 105 (format t "~Ds ~D Waiting state ~S~%" (- (get-universal-time) now) i (usocket::state s)) 106 (when (wait-for-input s :ready-only t :timeout 5) 107 (format t "~D state ~S~%" i (usocket::state s)) 108 (handler-bind 109 ((error (lambda (c) 110 (format t "socket-receive error: ~A~%" c) 111 (break) 112 nil))) 113 (multiple-value-bind (buffer count remote-host remote-port) 114 (socket-receive s buffer 1024) 115 (handler-bind 116 ((error (lambda (c) 117 (format t "socket-send error: ~A~%" c) 118 (break)))) 119 (when buffer 120 (socket-send s (subseq buffer 0 count) count 121 :host remote-host 122 :port remote-port))))))) 123 (socket-close s))))