第二十九章 TCP 客户端 服务器通信 - 记录的拼接

embedded/2024/11/25 11:22:41/

文章目录

  • 第二十九章 TCP 客户端 服务器通信 - 记录的拼接
  • 记录的拼接
  • 多路复用 `TCP`设备
  • 正在关闭连接
    • 使用`CLOSE`命令断开连接

第二十九章 TCP 客户端 服务器通信 - 记录的拼接

记录的拼接

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

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

第二个例子概述了在进程B完成将两条记录写入到TCP端口之后,当它发出读命令时,进程A如何接收一条串联的记录。

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

多路复用 TCP设备

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

可以使用Select()Publish()Export()Import()方法,使侦听器作业接受传入连接并将连接的设备传递给工作作业。此工作作业可以与远程客户端通信。

正在关闭连接

客户端或服务器端都可以结束TCP绑定连接。关闭连接的首选方法是客户端向TCP设备发出close命令。(或者,客户端可以发出HALT命令。)然后服务器应该向该设备发出另一个READ命令,并接收到<READ>错误,然后为TCP设备发出一个CLOSE命令。

这种顺序的原因是,根据TCP/IP标准,连接资源在CLOSE后保持两分钟,但仅用于“主动关闭器”——首先执行CLOSE的进程。因此,最好先关闭客户机,因为服务器的资源通常比客户机的资源更有限。

使用CLOSE命令断开连接

从客户端或服务器发出这样的CLOSE命令:

CLOSE "|TCP|devicenum"

如上所述,客户端最好先发出CLOSE命令。如果服务器首先发出CLOSE命令,客户端将收到<WRITE>错误,然后应该发出CLOSE命令。


http://www.ppmy.cn/embedded/140364.html

相关文章

pdf文档动态插入文字水印,45度角,旋转倾斜,位于文档中央,多行水印可插入中文

一行水印 /*** param inputFile 你的PDF文件地址* param outputFile 添加水印后生成PDF存放的地址* param waterMarkName 你的水印* return*/public static boolean waterMark(String inputFile,String outputFile, String waterMarkName){try {PdfReader reader new PdfRead…

STM32 UART的DMA与非DMA性能对比

低波特率发送数据发送数据比较占用CPU时间 DMA在低波特率发送数据时&#xff0c;应该还是比较有作用的。 实验代码 DEBUG_IO2_TOG(); UartDMASend(DebugRxBuf, m_Len); //9.3us DEBUG_IO2_TOG(); DEBUG_IO1_TOG(); SocUartSendString( INFRARED_UART, DebugRxBuf,…

241123-UEFI模式下Linux-Windows双系统通过Grub设置选择开机系统

A. 准备工作: 将Linux系统作为默认启动系统 通过BIOS或EasyUEFI设置启动首选项为对应的Linux系统 A.1 通过BIOS选择对应的Linux系统 技嘉进入BIOS的按键 A.2 通过绿色向上箭头置顶Linux系统&#xff0c;下载地址&#xff1a; EasyUEFI A.1 与 A.2本质上执行的相同的操作 B. …

unsloth vlm模型Qwen2-VL、Llama 3.2 Vision微调案例

T4卡15G显卡训练 参考: https://github.com/unslothai/unsloth 按自己显卡cuda版本安装 免费colab微调代码: Qwen2-VL: https://colab.research.google.com/drive/1whHb54GNZMrNxIsi2wm2EY_-Pvo2QyKh?usp=sharing from unsloth import FastVisionModel # NEW instead …

在云聊室项目中的前后端中,定义的一套前后端逻辑

1.用户信息 用户在完成登陆后&#xff0c;会获得token和userinfo的会话信息 // userinfo示范 {"id": null,"openId": "123123736EF541112312312313","nickname": "Deryck","roles": "player","p…

【jvm】解释器

目录 1. 说明2. 工作原理3. 特点4. JVM解释器与JIT编译器的关系5. JVM解释器的优化 1. 说明 1.JVM&#xff08;Java虚拟机&#xff09;解释器是JVM的一个重要组成部分&#xff0c;负责将Java字节码指令翻译并执行为本地机器码。 2. 工作原理 1.读取字节码指令&#xff1a;JV…

衡山派D133EBS 开发环境安装及SDK编译烧写镜像烧录

1.创建新文件夹&#xff0c;用来存放SDK包&#xff08;其实本质就是路径要对就ok了&#xff09;&#xff0c;右键鼠标通过Open Git Bash here来打开git 输入命令 git clone --depth1 https://gitee.com/lcsc/luban-lite.git 来拉取&#xff0c;如下所示&#xff1a;&#xff0…

Spring 框架环境搭建

一、新建 Maven 项⽬ 1.创建 Maven 的普通 Java 项⽬ 2. 设置项⽬的坐标 3.设置项⽬的 Maven 环境 4、设置项⽬的名称和存放的⼯作空间 二、调整项⽬环境 1. 修改 JDK 版本 2.改单元测试 JUnit 版本 3.build标签中的pluginManagement标签 三、添加 Spring 框架的依赖坐标 …