Clozure Lisp comum - TCP socket Programação - O envio de uma resposta
-
19-09-2019 - |
Pergunta
Eu tenho um programa muito pequeno que abre um socket e aceita uma conexão. Ele então pega o IP remoto e a porta.
Eu gostaria de enviar uma mensagem de texto para o computador remoto (telnet) e fechar a conexão.
Eu não posso determinar qual função é para enviar uma mensagem para o cliente telnet.
Clozure listas manuais uma função chamada "send a", mas diz que é para sockets UDP e eu estou trabalhando com sockets TCP.
Espero que alguém pode me dizer o que a função adequada é, ou, se "send-to" é a função adequada, como usá-lo corretamente.
Graças
(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))
Solução
A documentação do CCL:. ACEITA-CONNECTION diz que ele retorna um fluxo
Assim, você pode usar as operações de E / S normais (exemplo: PRINC) de Common Lisp com esse fluxo. Para I / O operações consulte os capítulos HyperSpec sobre 'correntes' e a 'impressão'.
(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)
Outras dicas
Em SBCL (usando usocket), eu uso a função SOCKET-STREAM para retornar um fluxo lisp, em seguida, usar o formato, escrever e afins para enviar as coisas do outro lado.