文章
· 十一月 24 阅读大约需 5 分钟

第三十一章 TCP 高级主题

第三十一章 TCP 高级主题

本页讨论使用 TCP/IPIRIS 数据平台进程之间进行通信的几个高级主题。

连接管理

服务器一次仅维护一个连接。如果在另一个连接打开时第二个客户端尝试连接,TCP/IP 会将该客户端放入队列中。在队列中时,第二个客户端可以向端口写入数据,就像已连接一样。第二个客户端写入的数据保留在缓冲区中,直到第一个连接关闭并且第二个客户端连接为止。

如果第二个客户端在连接存在之前发出READ,则会挂起。当第二个客户端在队列中时,第三个客户端的任何连接尝试都会失败。

如果已经打开 TCP 设备的客户端在第一个连接仍然存在时尝试第二次连接,则第二个OPEN命令会导致错误。将这种情况视为错误而不是USE命令可以防止出现意外的结果。如果错误的程序认为它已打开新连接,而实际上它正在重用可能具有不同目标或不同参数的现有连接,则可能会出现此类意外结果。

TCP 设备的作业命令

可以使用JOB命令来实现TCP并发服务器。 TCP 并发服务器允许同时为多个客户端提供服务。在这种模式下,客户端不必等待服务器完成为其他客户端提供服务。相反,每次客户端请求服务器时,它都会为该客户端生成一个单独的子作业,只要客户端需要它,该子作业就会保持打开状态。一旦生成该子作业(由JOB命令的返回指示),另一个客户端就可以请求服务,并且服务器也将为该客户端创建一个子作业。

非并发和并发模式下的客户端/服务器连接。

并发服务器使用JOB命令并设置了切换并发服务器位(位 4 或位 16)。位 16 是推荐设置。

  • 如果设置了位 4,则JOB命令将主要输入和主要输出进程参数中的 TCP 设备传递给衍生进程。每当在switch中包含位 4 时,必须在主要输入和主要输出过程参数中指定 TCP 设备。主输入和主输出必须使用相同的设备。不建议使用位 4;有关详细信息,请参阅《ObjectScript 参考》中的JOB命令。
  • 如果设置了位 16,则JOB命令将 TCP 设备、主要输入和主要输出进程参数的三个独立设备传递给生成的进程。可以使用主体输入和主体输出进程参数在JOB命令中指定其中两个 TCP 设备。还可以默认这些参数,如以下示例所示: JOB child:(:16:input:output)JOB child:(:16::))

在发出JOB命令之前,为主要输入和主要输出指定的设备必须:
- 保持开放
- 监听 TCP 端口
- 已接受传入连接

在执行JOB命令之后,生成过程中的设备仍在侦听 TCP 端口,但不再具有活动连接。应用程序应在发出JOB命令后检查$ZA ,以确保 TCP 设备状态中的 CONNECTED 位已重置。

生成的进程使用指定的 TCP 设备在指定的入口点启动。TCP 设备在子进程中与在父进程中具有相同的名称。 TCP 设备有一个连接的套接字。继承的TCP设备处于S(流)模式。但是,子进程可以使用USE命令更改模式。我们建议服务器以A(接受)模式打开TCP 设备。

  • switch =4 时,如果主设备上发生错误,作业只是停止,而不采取错误陷阱。这是因为当switch =4 时,TCP 设备是主要设备。要支持错误捕获,请使用switch =16 并为 TCP 设备指定另一个设备。
  • switch =4 时,如果远程 TCP 设备关闭连接,作业就会停止,而不会出现错误陷阱。要覆盖此默认行为并生成错误,必须设置%SYSTEM.Process类的 DisconnectErr() 方法。

可以使用%SYSTEM.Socket类方法(而不是JOB命令)来创建并发 TCP 服务器连接。但是,请注意, %SYSTEM.Socket方法假定辅助作业已启动。如果不需要侦听器作业来启动辅助作业,并且侦听器作业知道辅助作业的进程 ID (PID),则可以使用这些方法进行并发 TCP 服务器连接。

在某些情况下,TCP 将单独的记录连接起来形成单个记录。如果客户端或服务器进程向 TCP 端口发出一系列由 WRITE 分隔的WRITE命令,则可能会发生串联WRITE #命令来刷新缓冲区,无论连接的另一端是否正在等待READ命令。

下面的第一个示例概述了进程 A 在进程 B 将两条记录写入 TCP 端口时等待READ命令时如何接收两条单独的记录。

Process A                            Process B
%SYS> USE "|TCP|41880" R A U 0 W A   %SYS> USE "|TCP|41880" WRITE "ONE",!,"TWO"
<RETURN>                             <RETURN>
ONE
%SYS> USE 41880 R A U 0 W A 
<RETURN>
TWO

第二个示例概述了进程 A 在进程 B 完成向 TCP 端口写入两条记录后发出READ命令时如何接收一条串联记录。

Process A                           Process B
.                                   %SYS> USE "|TCP|41880" WRITE "ONE",!,"TWO"
.                                   <RETURN>
ONE
%SYS> USE "/TCP/41880" R A U 0 W A 
<RETURN>
ONETWO

多路复用 IRIS TCP 设备

%SYSTEM.Socket在提供了多路复用 IRIS TCP 设备的方法。 Fork()Select()方法允许使用单个作业同时处理接受新连接和从连接的 TCP设备读取数据。监听的 TCP 设备收到连接后,使用Fork()创建新的 TCP 设备用于读取数据。原始侦听 TCP 设备继续接受传入连接。可以使用Select()方法来等待侦听和连接的 TCP 设备。当新连接到达或数据可用时, Select()返回收到信号的设备名称。

可以使用Select()、 Publish()、 Export()Import()方法来让侦听器作业接受传入连接并将连接的设备传递给工作人员作业。该工作人员作业可以与远程客户端进行通信。

讨论 (0)1
登录或注册以继续