Receive 方法

概述

类型:

方法

适用的版本:

V1.0.4.0

G-SE-0045956.1.gif-high.gif

 

 

任务

读取并移除存储在接收缓冲区中的数据

功能描述

读取存储在接收缓冲区中的数据,如果在读取时没有检测到错误,然后将其移除。

UDINT 返回值指示写入到应用程序提供的缓冲区中的字节数。

有关接收方法的其他信息,请参阅接收方法

使用 TLS 建立连接时的注意事项

对于使用 TLS 和不使用 TLS 建立的不同连接,方法 Peek 和 Receive 的行为可能不同。这尤其体现在交换大数据包时。在藉由使用 TLS 的连接执行方法时,可能必须执行多次方法调用,直到所有数据都被复制或移动到应用程序缓冲区。在任何情况下,在处理数据之前,都应确认复制或移动的数据量以及数据是否完整。

接口

输入

数据类型

有效范围

描述

i_pbyReceiveBuffer

POINTER TO BYTE

-

接收到的数据所写入的缓冲区的起始地址。

i_udiReceiveBufferSize

UDINT

1 ... 2147483647

要读取的字节数。

注意: 这个值不得大于缓冲区的大小。

注意: 为了防止因存储器指针访问无效(在范围外)引起的非法访问,利用算术运算符 SIZEOF 和目标缓冲区来确定 i_udiReceiveBufferSize 的值。

In_Out

数据类型

有效范围

描述

iq_udiFillLevel

UDINT

1 ... 2147483647

应用提供的缓冲区在操作前的填充水平(数据将以此作为偏移量写入)和在所收到的字节被写入缓冲区后的填充水平。

使用对象

oFB_TCPClient/FB_TCPClient2

接收方法

此数据库中功能块 FB_TCPClient/FB_TCPClient2 和 FB_TCPServer/FB_TCPServer2 提供的数据接收方法提供了输入/输出参数 iq_udiFillLevel。此参数确定缓冲区内的偏移量,因此,数据在此处写入。每次执行此功能时,会将写入的字节数加上原始值,由此更新参数值。

如果数据分多个数据包接收,但必须存储在一个缓冲区中并且稍后将作为整体加以处理,则可反复调用相应的接收功能,而不修改上次功能调用的参数 iq_udiFillLevel

使用接收缓冲区大小 (i_udiReceiveBufferSize) 与填充水平之间的差来确定要读取的字节数上限。

功能调用示例

下图显示了缓冲区的内容以及两次功能调用的参数 iq_udiFillLevel 修改,这两次调用都成功完成了功能执行。

阶段

描述

示意图

1

在第一次调用功能之前,指针设置到缓冲区的第一个索引。填充水平设置为 0。参数 i_udiReceiveBufferSize 为缓冲区的绝对大小(单位为字节)。

G-SE-0058214.1.gif-high.gif

 

 

2

每次调用功能时,从填充水平的起点擦除缓冲区。

在该示例中,在第一次功能调用期间,将可用数据从 TCP 栈移动到缓冲区中。填充水平被此功能更新,并且指示缓冲区中读取的字节数。

TCP 栈有可用存储空间时,将向远程站点通知可用空间情况,这样,它就会发送后续数据包。

第二次功能调用在不对输入参数做任何修改的情况下执行。

G-SE-0058215.1.gif-high.gif

 

 

3

在第二次功能调用期间,再次将可用数据从 TCP 栈移动到缓冲区中。

填充水平被此功能更新,然后,其值等于 i_udiReceiveBufferSize 的值。这意味着接收缓冲区已满。如果结果为 FillLevelOutOfRange,则会放弃进一步的功能调用。

最后,如果接收缓冲区已满,您需要处理数据,并相应地更新缓冲区的填充水平值。

G-SE-0058216.1.gif-high.gif

 

 

每次功能调用的数据限制

取决于控制器,在其中一种 ReceiveSend 或 Peek 方法的一次功能调用期间移动的数据量是有限的。

控制器

可一次性移动的字节数*

M258、LMC058、M241、M251

2048 字节

PacDrive LMC、M262

>10 000 000 个字节(受到应用内存的限制)

*这是缓冲区大小与填充水平之间的最大差值。