2016-06-23 8 views
2

Das Computer-Algebra-System Maxima verwendet (open-socket), um sich mit seinem Frontend (wxMaxima oder xMaxima) zu verbinden. Danach ist es sicher, dass alle Ausgaben tatsächlich an das Frontend übergeben werden:Lisp: Gibt es einen Rückruf, der informiert, dass eine Verbindung von Open-Socket gerade gelöscht wurde?

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

Dies funktioniert gut (mit den Ausnahmen, die out-of-memory noch Bedingungen könnten manchmal zu über stdout und dass Fenster signalisiert werden out-of- Speicher möchte nicht "Verbindungsverlust" -Nachrichten an die Anwendungsmaxima senden, mit der sie verbunden ist, aber es ist einfach, dies zu umgehen. Leider, wenn die Netzwerkverbindung verloren geht, führt dies zu einer Fehlermeldung - da die Fehlerausgabe gebunden ist an das Netzwerk) verursacht eine Fehlermeldung, die dazu führt, dass ...

Gibt es eine Möglichkeit, einen Verbindungsverlust zu fangen, bevor dies zu einer Endlosschleife führt?

Es tut uns leid, eine so grundlegende Frage zu stellen. Aber ich habe seit Monaten keine Lösung gefunden und nehme an, ich brauche die Hilfe eines Experten.

+0

Für jeden Interessierten ist der Code hier: https://github.com/andrejv/maxima/blob/a7fedfafb146c1f33c42bdd71f421d559a8ca0be/archive/src/server.lisp#L11. Ich glaube nicht, dass es einen solchen Rückruf gibt. Wenn ich Ihr Problem richtig verstehe, versuche ich, den Socket in ein benutzerdefiniertes Stream-Objekt zu schreiben, das Verbindungsfehler behandeln und möglicherweise einen Fallback-Stream bereitstellen würde. – coredump

+1

Abgesehen von der Lisp-Implementierung müssen Sie verstehen, dass es in TCP * kein solches Ereignis * gibt. Sofern Sie nicht gerade an einer Netzwerkoperation beteiligt sind: eine Lese-, eine Schreib- oder eine Multiplexauswahl, gibt es für TCP keine Möglichkeit, Lisp mitzuteilen, dass die Verbindung unterbrochen wurde. – EJP

Antwort

1

Wie eine Common Lisp-Implementierung mit Netzwerkfehlern umgeht, ist implementierungsspezifisch.

Normalerweise wird eine Fehlerbedingung gemeldet.

Daher müssen Sie einen Condition Handler bereitstellen, der aktiv ist, während ein solches Problem auftreten könnte. Sie müssten etwas über das Common-Lisp-Bedingungssystem erfahren und wissen, wie man mit Bedingungen umgeht. Wie das mit Streams, Sockets, Netzwerkverbindungen funktioniert, ist sehr implementierungsspezifisch.