Clozure CL中文版010:用套接字编程

  • 0

Clozure CL中文版010:用套接字编程

Category:帮助手册 Tags : 

用套接字编程

概观

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-socketcode &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-socketsize code &key buffer extract offset want-socket-address-p               功能]

套接字读取UDP数据包。如果没有可用的数据包,则等待数据包到达。

如果:want-socket-address-p是nil默认值,则返回四个值:

  1. 带有数据的缓冲区
  2. 读取的字节数
  3. 32位无符号IPv4地址或数据发送方的16字节IPv6地址
  4. 数据发送方的端口号

如果:want-socket-address-p为true,则返回三个值:

  1. 带有数据的缓冲区
  2. 读取的字节数
  3. 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 socketcode &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。套接字在退出时关闭。


Leave a Reply

搜索

分类目录

公 告

本网站学习论坛:

www.zhlisp.com

lisp中文学习源码:

https://github.com/zhlisp/

欢迎大家来到本站,请积极评论发言;

加QQ群学习交流。