41.18 其他网络工具

以下附加函数对创建和操作网络连接很有用。注意它们仅在部分系统上受支持。

Function: network-interface-list &optional full family

该函数返回一个列表,描述当前机器的网络接口。返回值为一个关联表,元素格式为 (ifname . address)ifname 是表示接口名称的字符串,address 的格式与 make-network-processlocal-addressremote-address 参数相同,即整数向量。 默认情况下会尽可能同时返回 IPv4 和 IPv6 地址。

可选参数 full 若非 nil,则改为返回一个或多个格式为 (ifname addr bcast netmask) 的元素。 ifname 是标识接口的字符串(可不唯一)。addrbcastnetmask 均为整数向量,分别记录 IP 地址、广播地址和子网掩码。

可选参数 family 可指定为符号 ipv4ipv6, 从而将返回信息分别限制为 IPv4 或 IPv6 地址,与 full 的取值无关。 若系统不支持 IPv6 却指定 ipv6,将会抛出错误。

示例:

(network-interface-list) ⇒
(("vmnet8" .
  [172 16 76 1 0])
 ("vmnet1" .
  [172 16 206 1 0])
 ("lo0" .
  [65152 0 0 0 0 0 0 1 0])
 ("lo0" .
  [0 0 0 0 0 0 0 1 0])
 ("lo0" .
  [127 0 0 1 0]))
(network-interface-list t) ⇒
(("vmnet8"
  [172 16 76 1 0]
  [172 16 76 255 0]
  [255 255 255 0 0])
 ("vmnet1"
  [172 16 206 1 0]
  [172 16 206 255 0]
  [255 255 255 0 0])
 ("lo0"
  [65152 0 0 0 0 0 0 1 0]
  [65152 0 0 0 65535 65535 65535 65535 0]
  [65535 65535 65535 65535 0 0 0 0 0])
 ("lo0"
  [0 0 0 0 0 0 0 1 0]
  [0 0 0 0 0 0 0 1 0]
  [65535 65535 65535 65535 65535 65535 65535 65535 0])
 ("lo0"
  [127 0 0 1 0]
  [127 255 255 255 0]
  [255 0 0 0 0]))
Function: network-interface-info ifname

该函数返回名为 ifname 的网络接口信息。返回值为格式如下的列表: (addr bcast netmask hwaddr flags)

addr

互联网协议地址。

bcast

广播地址。

netmask

子网掩码。

hwaddr

二层地址(例如以太网 MAC 地址)。

flags

接口当前标志位。

注意该函数仅返回 IPv4 信息。

Function: format-network-address address &optional omit-port

该函数将网络地址的 Lisp 表示形式转换为字符串。

五元向量 [a b c d p] 表示 IPv4 地址 a.b.c.d 和端口号 pformat-network-address 会将其转换为字符串 "a.b.c.d:p"

九元向量 [a b c d e f g h p] 表示带端口号的 IPv6 地址。 format-network-address 会将其转换为字符串 "[a:b:c:d:e:f:g:h]:p"

若向量不包含端口号 p,或 omit-portnil, 则结果中不包含 :p 后缀。

Function: network-lookup-address-info name &optional family hints

该函数对 name 执行主机名解析,name 应为仅含 ASCII 的字符串,否则会抛出错误。 若需要查询国际化域名,应先对 name 调用 puny-encode-domain

若执行成功,函数返回网络地址的 Lisp 表示形式列表(格式说明参见 see make-network-process), 否则返回 nil。在后一种情况下,函数还会记录错误信息,尽可能说明失败原因。

默认情况下,该函数会同时尝试 IPv4 和 IPv6 解析。 可选参数 family 可控制该行为,指定符号 ipv4ipv6 可将解析分别限制为 IPv4 或 IPv6。

若可选参数 hintsnumeric,函数会将 name 视为数值型 IP 地址 (不执行 DNS 查询)。可用于检查字符串是否为合法的数值格式 IP 地址, 或将数值字符串转换为标准格式。例如:

(network-lookup-address-info "127.1" 'ipv4 'numeric)
    ⇒ ([127 0 0 1 0])

(network-lookup-address-info "::1" nil 'numeric)
    ⇒ ([0 0 0 0 0 0 0 1 0])

需要注意的是,某些合法格式可能出乎意料,尤其对 IPv4 而言, 例如 ‘0xe3010203’ 和 ‘0343.1.2.3’ 均为有效格式, ‘0’ 和 ‘1’ 也有效(但对 IPv6 无效)。