Clozure Common Lisp - TCP Socket Programming - Sen

2019-06-19 19:27发布

问题:

I have a very small program which opens a socket and accepts a connection. It then grabs the remote IP and port.

I'd like to send a text message to the remote computer (telnet) and close the connection.

I can't determine which function is for sending a message to the telnet client.

The Clozure manual lists a function called "send to" but it says it's for UDP sockets and I'm working with TCP sockets.

I hope someone can tell me what the proper function is, or, if "send-to" is the proper function, how to use it properly.

Thanks

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

回答1:

The documentation of CCL:ACCEPT-CONNECTION says that it returns a stream.

So you can use the normal I/O operations (example: PRINC) of Common Lisp with that stream. For I/O operations see the HyperSpec chapters on 'streams' and the '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)


回答2:

In SBCL (using usocket), I use the SOCKET-STREAM function to return a lisp stream, then use FORMAT, WRITE and the like to send things across.