如何设置iolib超时

时间:2019-01-22 08:38:45

标签: common-lisp

我正在将IOLIB与以下代码一起使用来解析主机名:

(sockets:address-to-string (sockets:lookup-hostname name))

我可以工作,但是这些函数不需要任何超时参数,而且我无法弄清楚如何使用套接字选项设置这些参数。

1 个答案:

答案 0 :(得分:4)

不幸的是,这不容易找到(特别是没有记录),但是按照lookup-hostname(Emacs中的 M-。)的调用链,您可以看到您的代码最终会调用dns-query

(defun dns-query (name &key (type :a) (search *dns-search-domain*)
                  (nameservers *dns-nameservers*) decode
                  (repeat *dns-repeat*) (timeout *dns-timeout*))
  ...)

timeout参数默认为特殊变量iolib/sockets::*dns-timeout*,该变量全局绑定为10。然后,您只需要将其绑定到代码周围即可设置其他超时:

(let ((iolib/sockets::*dns-timeout* 1))
  ...)

该变量不会导出,但是dns-query是,也许直接调用该函数会更好。

CL-USER> (iolib:dns-query "http://example.com" :timeout 0.0001)
NIL
CL-USER> (iolib:dns-query "http://example.com" :timeout 1)

#<DNS RESPONSE Id: 61273, Question: #(#<"http://example.com." A IN>) Flags: :OP/S :RD :RA :NAME-ERROR, Sections: QD(1) AN(0) NS(1) AD(0)>