Розетки в Лиспе - PullRequest
       14

Розетки в Лиспе

0 голосов
/ 02 сентября 2018

Я пытаюсь установить связь из сценария Lisp с другой программой, используя сокеты TCP / IP (с sbcl и библиотекой usocket в системе Linux). Через некоторые онлайн-источники мне удалось собрать следующий простой код:

(require 'asdf)
(require 'usocket)

(defun start-client (message)
  "Connects to server."
  (usocket:with-client-socket (socket stream "0.0.0.0" 30000)
    (format stream message)
    (force-output stream)))

(start-client "Hello!~%")

Этот код позволяет мне отправить сообщение (я проверил его, и оно работает). Моя проблема заключается в том, что мне нужно разделить этот код на две разные функции: одну для открытия соединения через сокет и другую для отправки разных сообщений в разное время. Также мне нужно добавить дополнительную функцию для получения сообщений от другой программы. Однако, поскольку я совсем новичок в Лиспе, я не смог этого сделать.

1 Ответ

0 голосов
/ 02 сентября 2018

Лучший способ (я думаю) будет иметь весь ваш сценарий в объеме 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. г. связывая динамическую переменную.

...