Common lisp 如何捕获cl异步包的TCP服务器中的套接字错误?

Common lisp 如何捕获cl异步包的TCP服务器中的套接字错误?,common-lisp,Common Lisp,如何捕获TCP套接字与cl asyncTCP服务器的意外断开?例如,下面的服务器无法处理客户端强制关闭telnet终端的情况。我想我应该在:event cb关键字之后添加处理程序,但我不知道如何将作为:信号处理程序组合 (require 'cl-async) (require 'babel) (defun my-tcp-server () (format t "Starting server.~%") (as:tcp-server nil 8888 ; nil mean

如何捕获TCP套接字与
cl async
TCP服务器的意外断开?例如,下面的服务器无法处理客户端强制关闭telnet终端的情况。我想我应该在
:event cb
关键字之后添加处理程序,但我不知道如何将
作为:信号处理程序
组合

(require 'cl-async)
(require 'babel)

(defun my-tcp-server ()
  (format t "Starting server.~%")
    (as:tcp-server
     nil 8888  ; nil means 0.0.0.0 to listen for any address
     ;; read-cb
     (lambda (socket data)
       (let ((data-str ; stores the received data in utf8 string
          (handler-case (babel:octets-to-string data :encoding :utf-8)
        (babel-encodings:invalidutf8-continuation-byte (err)
          (declare (ignore err))
          (format nil "^@~%")))))
     ;; exits if received "bye"
     (cond ((equal "bye" (string-right-trim '(#\Return #\Newline) data-str))
        (as:close-socket socket)
        (format t "Client disconnected.~%"))
           (t (format t "~a" data-str) ; echo on the server side
          (as:write-socket-data socket "Send to server > ")))))
     ;; handle SIGINT
     :event-cb (as:signal-handler 2 (lambda (sig)
                      (declare (ignore sig))
                      (as:free-signal-handler 2)
                      (as:exit-event-loop)))
     :connect-cb (lambda (socket)
           (format t "Client connected.~%")
           (as:write-socket-data socket "Send to server > "))))

(as:start-event-loop #'my-tcp-server)

你读过关于的文档了吗?所以我想我的问题应该是:信号处理程序
as:signal-handler
如何适应
handler案例
。从文档和示例来看,我觉得你把
as:signal-handler
放错地方了。doc说它返回
NIL
,而不是回调函数。
EVENT-CB
应该是一个接受单个参数的函数,即事件。查看文档,似乎
EVENT-CB
也是一个常规参数,而不是一个关键字。是的,
EVENT-CB
不是文档中的关键字,但它现在已被弃用,文档未更新。下面是您得到的警告:
警告:现在不推荐将事件cb作为第四个参数传递给tcp服务器。请改用:event cb关键字。
@jkiiski,感谢您指出
的位置为:SIGNAL-HANDLER
。因此,我不必将
信号处理程序
和错误处理程序组合在一起!