Clozure Common Lisp - Программирование TCP-сокетов - Отправка ответа

StackOverflow https://stackoverflow.com/questions/1524912

  •  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 и тому подобное для отправки данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top