Common lisp 如何捕获cl异步包的TCP服务器中的套接字错误?
如何捕获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
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
。因此,我不必将信号处理程序
和错误处理程序组合在一起!