changelog shortlog graph tags branches changeset files revisions annotate raw help

Mercurial > core / lisp/lib/net/udp.lisp

changeset 698: 96958d3eb5b0
parent: aac665e2f5bf
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
1 ;;; net/udp.lisp --- UDP utilities
2 
3 ;;
4 
5 ;;; Code:
6 (in-package :net/udp)
7 
8 (defvar *udp-ping-size* 512)
9 
10 (defun udp-ping-server (port &key (count 16))
11  (let ((s (make-instance 'inet-socket :type :datagram :protocol :udp)))
12  (socket-bind s #(0 0 0 0) port)
13  (loop for i from 0 upto count
14  do (multiple-value-bind (buf len address port) (socket-receive s nil *udp-ping-size*)
15  (format t "(~A) Received ~A bytes from ~A:~A - ~A ~%"
16  i len address port (subseq buf 0 (min 10 len))))
17  finally (socket-close s))))
18 
19 (defmacro with-udp-client ((socket-var &key (addr #(0 0 0 0)) (port 0) peer) &body body)
20  `(let ((,socket-var (make-instance 'inet-socket :type :datagram :protocol :udp)))
21  (unwind-protect
22  (progn
23  (socket-bind ,socket-var ,addr ,port)
24  ,(when peer `(apply #'socket-connect ,socket-var ,peer))
25  ,@body)
26  (socket-close ,socket-var))))
27 
28 (defmacro with-udp-client-and-server (((socket-class &rest common-initargs)
29  (listen-socket-var &rest listen-address)
30  (client-socket-var &rest client-address)
31  server-socket-var)
32  &body body)
33  `(let ((,listen-socket-var (make-instance ',socket-class ,@common-initargs))
34  (,client-socket-var (make-instance ',socket-class ,@common-initargs))
35  (,server-socket-var))
36  (unwind-protect
37  (progn
38  (setf (sockopt-reuse-address ,listen-socket-var) t)
39  (socket-bind ,listen-socket-var ,@listen-address)
40  (socket-listen ,listen-socket-var 5)
41  (socket-connect ,client-socket-var ,@client-address)
42  (setf ,server-socket-var (socket-accept ,listen-socket-var))
43  ,@body)
44  (socket-close ,client-socket-var)
45  (socket-close ,listen-socket-var)
46  (when ,server-socket-var
47  (socket-close ,server-socket-var)))))