Lisp 中的套接字
Sockets in Lisp
我正在尝试使用 TCP/IP 套接字(在 Linux 系统中使用 sbcl 和 usocket 库)从 Lisp 脚本到另一个程序进行通信。通过一些在线资源,我设法将以下简单代码放在一起:
(require 'asdf)
(require 'usocket)
(defun start-client (message)
"Connects to server."
(usocket:with-client-socket (socket stream "0.0.0.0" 30000)
(format stream message)
(force-output stream)))
(start-client "Hello!~%")
此代码可让我发送消息(我已经对其进行了测试并且有效)。我的问题是我需要将这段代码分成两个不同的函数,一个用于打开套接字连接,另一个用于在不同时间发送不同的消息。我还需要添加一个附加功能来接收来自其他程序的消息。但是,由于我对 Lisp 还很陌生,所以我没有这样做。
(我认为)最好的方法是将整个脚本放在 with-client-socket
的范围内。您可能有类似 main
函数的东西。这避免了资源泄漏。您可能希望使用动态变量来避免通过函数参数手动将套接字流传递到需要的地方。
否则,您必须自己管理套接字的关闭。任何可能导致程序终止的调用路径都需要受到某些 unwind-protect
的保护,这些 unwind-protect
使用 usocket:socket-close
关闭套接字。为此,您使用 usocket:socket-connect
打开套接字,并使用与 usocket:with-client-socket
相同的参数。 (您可以查看 usocket:with-client-socket
和 usocket:with-connected-socket
的来源以查看发生的交互。)
为了能够写入套接字流(可通过(usocket:socket-stream socket)
获得)并关闭套接字,您需要在某处记住它,例如。 G。通过绑定动态变量。
我正在尝试使用 TCP/IP 套接字(在 Linux 系统中使用 sbcl 和 usocket 库)从 Lisp 脚本到另一个程序进行通信。通过一些在线资源,我设法将以下简单代码放在一起:
(require 'asdf)
(require 'usocket)
(defun start-client (message)
"Connects to server."
(usocket:with-client-socket (socket stream "0.0.0.0" 30000)
(format stream message)
(force-output stream)))
(start-client "Hello!~%")
此代码可让我发送消息(我已经对其进行了测试并且有效)。我的问题是我需要将这段代码分成两个不同的函数,一个用于打开套接字连接,另一个用于在不同时间发送不同的消息。我还需要添加一个附加功能来接收来自其他程序的消息。但是,由于我对 Lisp 还很陌生,所以我没有这样做。
(我认为)最好的方法是将整个脚本放在 with-client-socket
的范围内。您可能有类似 main
函数的东西。这避免了资源泄漏。您可能希望使用动态变量来避免通过函数参数手动将套接字流传递到需要的地方。
否则,您必须自己管理套接字的关闭。任何可能导致程序终止的调用路径都需要受到某些 unwind-protect
的保护,这些 unwind-protect
使用 usocket:socket-close
关闭套接字。为此,您使用 usocket:socket-connect
打开套接字,并使用与 usocket:with-client-socket
相同的参数。 (您可以查看 usocket:with-client-socket
和 usocket:with-connected-socket
的来源以查看发生的交互。)
为了能够写入套接字流(可通过(usocket:socket-stream socket)
获得)并关闭套接字,您需要在某处记住它,例如。 G。通过绑定动态变量。