Clozure Common Lisp - TCP Socket Programming - Invio di un Commento
-
19-09-2019 - |
Domanda
Ho un programma molto piccolo che apre un socket e accetta una connessione. E poi afferra il IP remoto e la porta.
Mi piacerebbe inviare un messaggio di testo al computer remoto (telnet) e chiudere la connessione.
Non riesco a determinare quale funzione è per l'invio di un messaggio al client telnet.
Il Clozure manuale elenca una funzione chiamata "send a", ma si dice che è per socket UDP e sto lavorando con il socket TCP.
Spero che qualcuno mi può dire quale sia la funzione adeguata è, oppure, se "send-to" è la funzione corretta, come usarlo correttamente.
Grazie
(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))
Soluzione
La documentazione del CCL:. Accept-CONNECTION dice che restituisce un flusso
Quindi, è possibile utilizzare le normali operazioni I / O (esempio: princ) di Common Lisp con quel flusso. Per operazioni di I / O vedere i capitoli HyperSpec su 'flussi' e la 'stampante'.
(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)
Altri suggerimenti
In SBCL (utilizzando usocket), io uso la funzione PRESA DI STREAM per restituire un flusso di Lisp, quindi utilizzare FORMAT, scrivere e simili per inviare le cose attraverso.