Clozure Common Lisp - Программирование TCP-сокетов - Отправка ответа
-
19-09-2019 - |
Вопрос
У меня есть очень маленькая программа, которая открывает сокет и принимает соединение.Затем он захватывает удаленный IP-адрес и порт.
Я бы хотел отправить текстовое сообщение на удаленный компьютер (telnet) и разорвать соединение.
Я не могу определить, какая функция предназначена для отправки сообщения клиенту telnet.
Тот Самый Руководство по закрытию выводит функцию с именем "отправить в", но там сказано, что она предназначена для 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))
Решение
В документации CCL:ACCEPT-CONNECTION говорится, что он возвращает поток.
Таким образом, вы можете использовать обычные операции ввода-вывода (пример:PRINCC) 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)
Другие советы
В SBCL (используя usocket) я использую функцию SOCKET-STREAM для возврата потока lisp, затем использую FORMAT , WRITE и тому подобное для отправки данных.