我正在将IOLIB与以下代码一起使用来解析主机名:
(sockets:address-to-string (sockets:lookup-hostname name))
我可以工作,但是这些函数不需要任何超时参数,而且我无法弄清楚如何使用套接字选项设置这些参数。
答案 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)>