(require :sb-posix) (require :sb-bsd-sockets) (defconstant data "sup") (defconstant port-min 1024) (defconstant port-max 65535) (setf *random-state* (make-random-state t)) (defun list-ip (ip &optional (start 0)) (let ((pos (position #\. ip :start start))) (if pos (cons (parse-integer (subseq ip start pos)) (list-ip ip (1+ pos))) (list (parse-integer (subseq ip start)))))) (defun parse-ip (ip) (make-array 4 :initial-contents (list-ip ip))) (defun fmt-ip (ip) (format nil "~d.~d.~d.~d" (aref ip 0) (aref ip 1) (aref ip 2) (aref ip 3))) (defun random-port () (+ port-min (random (1+ (- port-max port-min))))) (defun klok () (/ (get-internal-real-time) internal-time-units-per-second)) (let ((loc-port (parse-integer (second *posix-argv*))) (rem-ip (parse-ip (third *posix-argv*))) (interval (parse-integer (fourth *posix-argv*))) (sock (make-instance 'sb-bsd-sockets:inet-socket :type :datagram :protocol :udp)) (start (klok)) (pak 0)) (setf (sb-bsd-sockets:sockopt-reuse-address sock) t) (setf (sb-bsd-sockets:non-blocking-mode sock) t) (sb-bsd-sockets:socket-bind sock #(0 0 0 0) loc-port) (defun send (str ip port) (sb-bsd-sockets:socket-send sock str (length str) :address (list ip port))) (defun recv () (sb-bsd-sockets:socket-receive sock nil 64)) (format t "drilling pls wait...~%") (setf interval (/ interval 1000000)) (loop (sleep interval) (send data rem-ip (random-port)) (incf pak) (multiple-value-bind (buf len ip port) (recv) (when (string= (subseq buf 0 len) data) (format t "connected to ~a:~d in ~f sec with ~d packets sent~%" (fmt-ip ip) port (- (klok) start) pak) (dotimes (x 1000) (sleep interval) (send data ip port)) (exit)))))