2009-10-06 9 views
6

J'ai un très petit programme qui ouvre une socket et accepte une connexion. Il attrape ensuite l'adresse IP et le port distants.Clozure Common Lisp - Programmation de socket TCP - Envoi d'une réponse

Je voudrais envoyer un message texte à l'ordinateur distant (telnet) et fermer la connexion.

Je ne peux pas déterminer quelle fonction est pour envoyer un message au client telnet.

Le Clozure manual répertorie une fonction appelée "envoyer à" mais il dit que c'est pour les sockets UDP et que je travaille avec des sockets TCP.

J'espère que quelqu'un peut me dire quelle est la fonction appropriée, ou, si "envoyer à" est la fonction appropriée, comment l'utiliser correctement.

Merci

(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)) 

Répondre

8

La documentation de CCL: ACCEPT-CONNECTION indique qu'il renvoie un flux. Par conséquent, vous pouvez utiliser les opérations d'E/S normales (exemple: PRINC) de Common Lisp avec ce flux. Pour les opérations d'E/S, voir les chapitres HyperSpec sur 'streams' et 'printer'.

(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) 
3

En SBCL (en utilisant usocket), utiliser la fonction SOCKET-STREAM pour renvoyer un flux Lisp, puis utilisez FORMAT, écrire et similaires envoyer des choses à travers.

Questions connexes