Zu Common Lisp - TCP-Socket-Programmierung - Senden Sie eine Antwort
-
19-09-2019 - |
Frage
habe ich ein sehr kleines Programm, das eine Buchse öffnet und akzeptiert eine Verbindung. Es ergreift dann den Remote-IP und Port.
Ich möchte eine SMS-Nachricht an den Remote-Computer senden (telnet) und schließen Sie die Verbindung.
Ich kann nicht feststellen, welche Funktion eine Nachricht an das Telnet-Client für das Senden.
Die Clozure Handbuch listet eine Funktion namens „send zu“, aber es sagt, dass es für UDP-Sockets ist und ich arbeite mit TCP-Sockets.
ich hoffe, jemand kann mir sagen, was die richtige Funktion ist, oder, wenn „Senden an“ die richtige Funktion ist, wie man es richtig verwenden.
Danke
(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))
Lösung
Die Dokumentation von CCL. ACCEPT-CONNECTION sagt, dass es einen Stream zurück
So können Sie die normalen I / O-Operationen verwenden können (Beispiel: PRINC) von Common Lisp mit diesem Strom. Für I / O-Operationen finden Sie in das HyperSpec Kapitel über ‚Ströme‘ und den ‚Drucker‘.
(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)
Andere Tipps
In SBCL (mit usocket), verwende ich die SOCKET-STREAM-Funktion einen Lisp-Stream zurückzukehren, verwenden Sie FORMAT, WRITE und dergleichen über die Dinge zu senden.