Lisp 中的套接字

标签 sockets common-lisp sbcl

我正在尝试使用 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 的保护。使用 usocket:socket-close 关闭套接字.为此,您使用 usocket:socket-connect 打开套接字使用与 usocket:with-client-socket 相同的参数. (您可以查看 usocket:with-client-socketusocket:with-connected-socket 的来源,以了解正在发生的交互。)

为了能够写入套接字流(可通过 (usocket:socket-stream socket) 获得)并关闭套接字,您需要在某处记住它,例如。 G。通过绑定(bind)动态变量。

关于Lisp 中的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52136247/

相关文章:

lisp - 来自 Steel Bank Common Lisp & Slime 的最大调试信息

printing - (漂亮)在 Common Lisp 中打印大对象

Java 和 JavaFX 安全

lisp clos 访问器问题

lisp - 如何从 Lisp 类导出槽和访问器?

lisp - 为什么阅读器宏扩展不传播到运行时(读取)?

C、socket编程: Connecting multiple clients to server using select()

c - 在C中,对于套接字,recvmsg()有队列吗?

c# - TcpClient应该用于这种情况吗?

lisp - 如何使用 ltk 显示图像?