【问题标题】:Lisp: Is there a callback that informs that a connection from open-socket has just dropped?Lisp:是否有一个回调通知来自 open-socket 的连接刚刚断开?
【发布时间】:2016-06-23 07:25:55
【问题描述】:

计算机代数系统 Maxima 使用(open-socket) 连接到其前端(wxMaxima 或 xMaxima)。之后,它会确保所有输出都实际传递到前端:

(setq *standard-input* sock)
(setq *standard-output* sock)
(setq *error-output* sock)
(setq *terminal-io* sock)
(setq *trace-output* sock)
(format t "pid=~a~%" (getpid))
(force-output sock)
(setq *debug-io* sock))

这很好用(除了内存不足的情况仍然可能通过标准输出发出信号,并且有时内存不足的窗口不想发送“连接丢失”消息到应用程序最大值已连接到,但很容易解决这个问题。不幸的是,如果网络连接丢失,这会导致错误消息 - (因为错误输出绑定到网络)会导致错误消息导致...

有没有办法在连接丢失导致无限循环之前捕获连接丢失?

很抱歉提出这样一个看似基本的问题。但是几个月来我都没有找到解决方案,我想我需要专家的帮助。

【问题讨论】:

  • 任何有兴趣的人,代码在这里:github.com/andrejv/maxima/blob/…。我不认为有这样的回调。如果我正确理解了您的问题,我会尝试将套接字包装在自定义流对象中,该对象将处理连接错误并可能提供后备流。
  • 抛开 Lisp 实现不谈,你需要了解在 TCP 中没有这样的事件。除非您实际参与网络操作:读取、写入或多路选择,否则 TCP 无法告诉 Lisp 连接已断开。

标签: sockets networking callback common-lisp disconnect


【解决方案1】:

Common Lisp 实现如何处理网络错误是特定于实现的。

通常会发出错误信号。

因此,您需要提供一个条件处理程序,该处理程序在可能出现此类问题时处于活动状态。您需要了解 Common Lisp 条件系统以及如何处理条件。这如何与流、套接字、网络连接一起工作是非常特定于实现的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2022-01-23
    • 1970-01-01
    • 2015-11-12
    相关资源
    最近更新 更多