2009-10-06 33 views
6

Tôi có một chương trình rất nhỏ mở ổ cắm và chấp nhận kết nối. Sau đó nó lấy IP và cổng từ xa.Clozure Common Lisp - Lập trình socket TCP - Gửi trả lời

Tôi muốn gửi tin nhắn văn bản tới máy tính từ xa (telnet) và đóng kết nối.

Tôi không thể xác định chức năng nào để gửi tin nhắn đến máy khách telnet.

Clozure manual liệt kê một chức năng được gọi là "gửi tới" nhưng nó cho biết đó là ổ cắm UDP và tôi đang làm việc với các cổng TCP.

Tôi hy vọng ai đó có thể cho tôi biết chức năng thích hợp là gì, hoặc, nếu "gửi đến" là chức năng thích hợp, cách sử dụng đúng cách.

Cảm ơn

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

Trả lời

8

Tài liệu của CCL: ACCEPT-CONNECTION cho biết rằng nó trả về luồng.

Vì vậy, bạn có thể sử dụng các hoạt động I/O thông thường (ví dụ: PRINC) của Common Lisp với luồng đó. Đối với các hoạt động I/O, xem các chương HyperSpec trên 'suối' và 'máy in'.

(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

Trong SBCL (sử dụng usocket), tôi sử dụng chức năng SOCKET-STREAM để trả về một dòng lisp, sau đó sử dụng FORMAT, VIẾT và những thứ tương tự để gửi những điều trên.