Clozure Common Lisp - Программирование сокетов TCP - отправка ответа - PullRequest
6 голосов
/ 06 октября 2009

У меня очень маленькая программа, которая открывает сокет и принимает соединение. Затем он получает удаленный IP-адрес и порт.

Я хотел бы отправить текстовое сообщение на удаленный компьютер (telnet) и закрыть соединение.

Я не могу определить, какая функция предназначена для отправки сообщения клиенту telnet.

В руководстве Clozure перечислены функции, называемые "send to", но сказано, что это для сокетов UDP, и я работаю с сокетами TCP.

Я надеюсь, что кто-то может сказать мне, что такое правильная функция, или, если "send-to" - это правильная функция, как правильно ее использовать.

Спасибо

(setq my-socket (ccl:make-socket :connect :passive :format :text
        :local-port 20000 :reuse-address t))

(setq connection (ccl:accept-connection my-socket))

(setq remote-host (ccl:remote-host connection))

(setq remote-port (ccl:remote-port connection))

Ответы [ 2 ]

8 голосов
/ 06 октября 2009

В документации CCL: ACCEPT-CONNECTION говорится, что он возвращает поток.

Таким образом, вы можете использовать обычные операции ввода-вывода (например, PRINC) Common Lisp с этим потоком. Для операций ввода-вывода см. Главы HyperSpec «потоки» и «принтер».

(defun st (port)
  (ccl:with-open-socket (socket :connect :passive
                                :format :text
                                :local-port port
                                :reuse-address t)
    (with-open-stream (stream (ccl:accept-connection socket))
      (princ "CCL example response" stream))))

; example call
(st 20000)
4 голосов
/ 06 октября 2009

В SBCL (с использованием usocket) я использую функцию SOCKET-STREAM для возврата потока lisp, затем использую FORMAT, WRITE и т.

...