Clozure CL中文版010:用套接字编程
Category:帮助手册用套接字编程
概观
Clozure CL支持进程间通信的套接字抽象。套接字表示与另一个进程的连接,通常(但不一定)与到网络上某个其他计算机上运行的客户端或服务器的TCP / IP网络连接。
IPv6由以下地址支持:internet6地址系列。应用程序应使用该resolve-address 功能将主机和端口规范转换为套接字地址。虽然主机和端口号仍然可以单独处理,但最好使用ccl::socket-address实例来指定套接字端点,以便统一解析字符串表示和打印。
本章中提到的所有符号都是从CCL包中导出的。从版本0.13开始,这些符号还从OPENMCL-SOCKET包中导出。
Clozure CL支持三种类型的套接字:TCP套接字,UDP套接字和Unix域套接字。除了最神秘的网络情况之外,这应该足够了。所有套接字都是由make-socket。套接字的类型取决于它的参数,如下所示:
TCP流
TCP / IP连接上的缓冲双向流。tcp-stream是流的子类,您可以使用所有常用的流函数来读取和写入它。由(make-socket:address-family:internet:type:stream:connect:active …)或(accept-connection …)创建。
文件插槽流
“UNIX域”连接上的缓冲双向流。file-socket-stream是流的子类,您可以使用所有常用的流函数来读取和写入它。由(make-socket:address-family:file:type:stream:connect:active …)或(accept-connection …)创建,
监听套接字
用于侦听特定端口上的传入TCP / IP连接的被动套接字。侦听器套接字不是流。它不支持I / O. 它只能用于通过accept-connection创建新的tcp-stream。创建者(make-socket:type:stream:connect:passive …)
文件侦听器插座
用于侦听由本地文件系统中的文件命名的传入UNIX域连接的被动套接字。侦听器套接字不是流。它不支持I / O. 它只能用于通过accept-connection创建新的文件套接字流。创建者(make-socket:address-family:file:type:stream:connect:passive …)
UDP套接字
表示基于数据包的UDP / IP连接的套接字。udp-socket支持I / O,但它不是流。相反,您必须使用特殊函数send-to和receive-from来读取和写入它。创建者(make-socket:type:datagram …)
套接字字典
make-socket &key address-family type connect eol format remote-address remote-host remote-port local-address local-host local-port local-filename remote-filename keepalive reuse-address nodelay broadcast linger backlog input-timeout output-timeout connect-timeout auto-关闭 截止日期[功能]
做一个插座。
地址家族
此套接字的地址/协议族。目前,:支持Internet(默认),表示IPv4,:internet6,表示IPv6,以及:file,表示UNIX域地址。
类型
其中之一:stream(默认值)请求面向连接的套接字,或:datagram请求无连接套接字。默认值为:stream。
连
此参数仅与类型为:socket的套接字相关。其中之一:active(默认值)请求a:被动请求文件或TCP侦听器套接字。
EOL
该参数目前被忽略(它与Franz Allegro的兼容性被接受)。
格式
以下之一:text(默认值),:binary或:bivalent。这个参数被忽略为:现在的流套接字,因为:流套接字当前总是二进制的(即它们同时支持字符和字节I / O)。对于:datagram套接字,忽略此参数(数据报套接字的格式始终为:binary)。
远程
对于TCP流,它指定要连接的套接字地址,指定为套接字地址实例。忽略侦听器套接字。对于UDP套接字,它可用于为后续调用send-to或receive-from指定默认地址。
远程主机
对于TCP流,它指定要连接的主机(以解析地址可接受的任何格式)。忽略侦听器套接字。对于UDP套接字,它可用于为后续调用send-to或receive-from指定默认主机。
远程端口
对于TCP流,它指定要连接的端口(以解析地址可接受的任何格式)。忽略侦听器套接字。对于UDP套接字,它可用于为后续调用send-to或receive-from指定后续调用的默认端口。
远程文件名
对于文件套接字流,它指定本地文件系统中的文件名(例如,不通过NFS,AFP,SMB等安装),它命名和控制对UNIX域套接字的访问。
本地地址
允许您为侦听器或UDP套接字指定本地地址,以用于出于安全原因要限制到达特定本地地址的连接的情况。
本地主机
允许您为侦听器或UDP套接字指定本地主机地址,以用于出于安全原因要限制到达特定本地地址的连接的情况。
本地端口
为套接字指定本地端口。对侦听器套接字最有用,它是套接字将侦听连接的端口。
本地文件名
对于文件侦听器套接字,指定本地文件系统中用于命名UNIX域套接字的文件的名称。创建文件侦听器套接字时,以前不应存在实际的文件系统文件; 其父目录应该存在并且可以由调用者写入。当关闭文件侦听器套接字时,将删除用于命名套接字的文件。
活着
如果为true,则启用“keepalive”消息的定期传输。
复用地址
如果为true,则允许在侦听器套接字中重用本地端口,从而覆盖某些TCP / IP协议规范。如果您正在调试服务器,则需要这个..
NODELAY
如果为true,则禁用Nagle的算法,该算法尝试通过在没有回复的情况下引入传输延迟来最小化TCP数据包碎片。如果您使用的协议涉及发送稳定的数据流而没有回复,并且吞吐量显着下降,请尝试设置此项。
广播
如果为true,则请求在UDP套接字上广播数据报的权限。
萦绕
如果指定且非nil,则应该是允许OS在完成关闭时等待数据被推送的秒数。仅与TCP套接字相关。
积压
对于侦听器套接字,指定可以挂起但不被接受的连接数。默认值为5,这也是某些操作系统上的最大值。
输入超时
输入操作超时前的秒数。必须是0到100万之间的实数。如果输入操作的时间超过指定的秒数,input-timeout则会发出错误信号。(请参阅流超时和截止日期)
输出超时
输出操作超时前的秒数。必须是0到100万之间的实数。如果输出操作的时间超过指定的秒数,output-timeout则会发出错误信号。(请参阅流超时和截止日期)
连接超时
连接尝试超时之前的秒数。[TODO:什么是可接受的值?]如果连接尝试的时间超过指定的秒数,socket-error则会发出a 信号。如果指定的时间间隔短于OS的套接字层施加的时间间隔(有时是一两分钟),这可能很有用。
自动关闭
当非nil时,任何生成的套接字流将在GC可以证明该流未被引用时关闭。这是通过CCL的终止机制[TODO add xref]完成的。
截止日期
以内部时间单位指定绝对时间。如果流上的I / O操作未在截止时间之前完成,则会发出 COMMUNICATION-DEADLINE-EXPIRED 错误信号。截止日期优先于可设置的任何输入/输出超时。(请参阅流超时和截止日期)
创建并返回一个新套接字。对于:被动套接字,需要:local-address,:local-port或:local-filename参数,具体取决于套接字的类型。对于:活动套接字,可以是:remote-address,:remote-host和:remote-port,或者:remote-filename参数必须存在,具体取决于套接字类型。
accept-connection (socket listener-socket) code &key (wait t) [功能]
在socket的挂起连接队列中提取第一个连接,接受它(即完成连接启动协议),并返回表示新建立的连接的新tcp-stream或file-socket-stream。tcp流继承了相关的侦听器套接字的任何属性(例如:keepalive,:nodelay等等。)原始侦听器套接字继续打开侦听更多连接,因此您可以再次对其调用accept-connection。
如果:wait是t,并且没有等待接受的连接,则该功能等待直到一个到达。否则,accept-connection将nil立即返回。
resolve-address &key host port socket-type connect address-family numeric-host-p numeric-service-p singleperrorp [功能]
将主机和/或端口规范转换为一个或多个ccl::socket-address实例。此函数使用下面的getaddrinfo()系统函数,该函数知道如何转换所有标准地址和端口格式,并为具有多个地址的主机正确地命令地址。它返回最佳匹配转换,如果:singlep为false ,则返回给定参数组合的所有匹配转换。
主办
主机规范,作为字符串。这可以是主机名,例如“clozure.com”,也可以是getaddrinfo()接受的任何文字地址表单。
港口
端口规格。这可以是服务名称,例如“http”或端口号。
插座型
端口查找的服务类型可以是:TCP服务流或UDP数据报。默认为:stream。
连
指定如何使用返回的ccl::socket-address实例。如果:active被传递,这是默认值,如果未指定,则主机地址将默认为本地主机的回送接口的地址。当使用:passive时,主机地址将默认为给定地址系列的通配符地址。如果使用:host参数,则此参数无效。
地址家族
指定应返回的地址系列,可以指定为:internet或:internet6。如果指定,则仅返回该族的地址。
数字主机-P
如果此参数为true,则不会对主机地址执行主机名查找。在这种情况下,必须传递数字地址文字。
数字端口 – 对
如果此参数为true,则不会对端口地址执行服务名称查找。在这种情况下,必须传递数字端口号。
singlep
如果此参数设置为true值(默认值),则仅返回第一个匹配的地址。如果它作为NIL传递,则所有匹配的地址将作为列表返回。
errorp
如果此参数设置为true值(默认值),则如果给定的主机和/或端口组合未产生任何匹配,则会发出错误信号。如果它作为NIL传递,如果没有地址与提供的参数匹配,则函数返回NIL。
dotted-to-ipaddr dotted &key (errorp t) [功能]
将虚线(应该是点状四字符串,如“192.168.0.1”)转换为整数表示形式。如果:errorp为true,则如果点缀无效,则会发出错误信号。否则,nil返回。
ipaddr-to-dotted ipaddr &key values [功能]
此函数将表示IPv4主机的整数ipaddr转换为虚线四字符串。如果:values为真,则将地址的四个八位字节作为多个值返回,而不是虚线四字符串。
ipaddr-to-hostname ipaddr &key ignore-cache [功能]
将ipaddr(一个32位的unsigend整数)转换为主机名字符串。关键字参数:ignore-cache被忽略(它与Franz Allegro CL的兼容性被接受)。
lookup-hostname host-spec [功能]
将host-spec转换为32位无符号IPv4地址。支持IPv6的应用程序应该使用该resolve-address功能。
host-spec的可接受格式包括主机名字符串,如“www.clozure.com”,虚线地址字符串,如“192.168.0.1”,或32位无符号IPv4地址,如3232235521。
lookup-port port protocol [功能]
查找指定端口和 协议的数字端口号。port可以是诸如“http”的字符串,诸如符号:http或端口号之类的字符串。请注意,字符串区分大小写。在查找之前,符号名称将转换为小写。协议必须是“tcp”或“udp”之一。
receive-from (socket udp-socket) size code &key buffer extract offset want-socket-address-p 功能]
从套接字读取UDP数据包。如果没有可用的数据包,则等待数据包到达。
如果:want-socket-address-p是nil默认值,则返回四个值:
- 带有数据的缓冲区
- 读取的字节数
- 32位无符号IPv4地址或数据发送方的16字节IPv6地址
- 数据发送方的端口号
如果:want-socket-address-p为true,则返回三个值:
- 带有数据的缓冲区
- 读取的字节数
- 该ccl::socket-address数据的发送方的实例。
插座
要读取的套接字
尺寸
要读取的最大字节数。如果数据包大于此数,则丢弃任何额外字节。
缓冲
如果指定,则必须是一个八位字节向量,用于读入数据。如果未指定,将创建一个新缓冲区(由socket-format确定的类型)。
提取
如果为真,则提取仅对应于读入的数据的缓冲区的子序列并作为第一值返回。如果为false(默认值),则返回原始缓冲区,即使它仅部分填充。
抵消
指定要存储数据的缓冲区的起始偏移量。默认值为0。
想插槽地址-P
指示数据发送方的地址应作为ccl::socket-address实例返回,而不是作为单独的主机和端口值返回。
send-to (socket udp-socket)缓冲区 大小 代码 &key 远程 remote-host remote-port offset[功能]
此函数通过套接字发送UDP数据包。
插座
要写入的套接字
缓冲
包含要发送的数据的向量。它必须是八位字节向量。
尺寸
要发送的八位字节数
远程
作为ccl::socket-address实例发送数据包的远程地址。默认值是对make-socket调用中指定的远程地址。
远程主机
主机以查询主机名可接受的任何格式发送数据包。默认值是在make-socket调用中指定的远程主机。
远程端口
发送数据包的端口,以lookup-port可接受的任何格式。默认值是在make-socket调用中指定的远程端口。
抵消
分组数据开始的缓冲区中的偏移量
shutdown socket &key direction[功能]
关闭由socket表示的双向连接的一部分。典型的socket将是一个tcp-stream。这可能有用的一种情况是,您需要在发送文件结束信号后读取响应。关键字参数:direction可以是 :input(禁止进一步输入)或 :output(禁止进一步输出)。
socket-os-fd socket [功能]
返回本机OS的套接字表示,或者nil套接字是否已关闭。在Unix上,这将是一个文件描述符。请注意,使用tcp-stream文件描述符是相当危险的,因为在操作系统级别上有各种各样的缓冲和异步I / O. listener-socket和udp-socket文件描述符更容易直接混乱,因为没有更少的魔法。
remote-host socket [功能]
返回远程主机的32位无符号的IPv4地址,或者nil如果插座未连接。
remote-port socket [功能]
返回的远程端口号插座如果,或NIL 插座未连接。
local-host socket [功能]
返回32位无符号IPv4地址或socket的本地主机的16字节IPv6地址。
local-port socket [功能]
此函数返回套接字的本地端口号。
socket-address-family thing [功能]
返回:internet,:internet6或:file,适用于 thing,它应该是套接字或套接字地址。
socket-address-host socket-address [功能]
返回给定套接字地址的主机部分。对于:Internet地址,这是一个32位整数。对于:internet6地址,返回16字节的向量。对于:文件地址,它是文件名字符串。
socket-address-port socket-address [功能]
此函数返回给定套接字地址的端口号。此功能仅可用 :internet和:internet6套接字地址。
socket-connect socket [功能]
此函数检查tcp-stream,侦听器套接字和udp-socket的套接字和返回。:active:passivenil
socket-format socket [功能]
返回由make-socket的:format参数指定的socket格式。
socket-type socket [功能]
如果socket是tcp-stream或listener-socket,则此函数返回:stream。如果套接字是udp-socket,socket-type则返回:datagram。
socket-address[类]
此类是套接字端点地址的表示形式。此类的实例用于封装IP套接字端点的主机和端口或文件套接字的文件名。它们可以由应用程序从resolve-address函数的可能符号地址表示中创建。
socket-error[类]
由套接字函数(类的子类)发出的OS错误类simple-error。
socket-error-code socket-error[功能]
返回socket-error中包含的OS错误代码。
socket-error-identifier socket-error[功能]
返回表示socket-error中包含的套接字错误代码的符号。这将是一 :address-in-use,:connection-aborted,:no-buffer-space,:connection-timed-out,:connection-refused,:host-unreachable,:host-down,:network-down,:address-not-available,:network-reset,:connection-reset,:shutdown,:access-denied,或:unknown。
socket-error-situation socket-error[功能]
返回一个字符串,描述发生错误套接字错误的上下文。在Linux上,这是返回错误的系统调用的名称。
close (socket socket) code &key abort [方法]
关闭套接字,释放与之关联的操作系统资源。通常,任何挂起的缓冲I / O都将在关闭之前完成,但如果:abort是t,则任何挂起的I / O都将被中止。请注意,对于侦听器和udp套接字,永远不会有任何缓冲的I / O进行清理,因此:abort有效地忽略了值。
with-open-socket (var . make-socket-args) &body body [宏]
执行体与VAR结合到应用的结果make-socket,以使插座-ARGS。套接字在退出时关闭。
http://mip.i3geek.com