Лучший способ (я думаю) будет иметь весь ваш сценарий в объеме with-client-socket
. У вас может быть что-то вроде main
функции, где это будет соответствовать. Это позволяет избежать утечек ресурсов. Возможно, вы захотите использовать динамическую переменную, чтобы избежать передачи потока сокета вручную через аргументы функции туда, где это необходимо.
В противном случае вам придется самостоятельно управлять закрытием сокета. Любой путь вызова, который может привести к завершению программы, должен быть защищен некоторым unwind-protect
, который закрывает сокет с помощью usocket:socket-close
. Для этого вы открываете сокет, используя usocket:socket-connect
с теми же аргументами, что и для usocket:with-client-socket
. (Вы можете взглянуть на источник для usocket:with-client-socket
и usocket:with-connected-socket
, чтобы увидеть происходящие взаимодействия.)
Для того, чтобы иметь возможность записи в поток сокетов (можно получить через (usocket:socket-stream socket)
) и закрыть сокет, вам нужно где-то запомнить его, e. г. связывая динамическую переменную.