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