读取并移除存储在接收缓冲区中的数据
读取存储在接收缓冲区中的数据,如果在读取时没有检测到错误,然后将其移除。
UDINT 返回值指示写入到应用程序提供的缓冲区中的字节数。
有关接收方法的其他信息,请参阅接收方法。
对于使用 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 为缓冲区的绝对大小(单位为字节)。 |
![]()
|
2 |
每次调用功能时,从填充水平的起点擦除缓冲区。 在该示例中,在第一次功能调用期间,将可用数据从 TCP 栈移动到缓冲区中。填充水平被此功能更新,并且指示缓冲区中读取的字节数。 TCP 栈有可用存储空间时,将向远程站点通知可用空间情况,这样,它就会发送后续数据包。 第二次功能调用在不对输入参数做任何修改的情况下执行。 |
![]()
|
3 |
在第二次功能调用期间,再次将可用数据从 TCP 栈移动到缓冲区中。 填充水平被此功能更新,然后,其值等于 i_udiReceiveBufferSize 的值。这意味着接收缓冲区已满。如果结果为 FillLevelOutOfRange,则会放弃进一步的功能调用。 最后,如果接收缓冲区已满,您需要处理数据,并相应地更新缓冲区的填充水平值。 |
![]()
|
取决于控制器,在其中一种 Receive、Send 或 Peek 方法的一次功能调用期间移动的数据量是有限的。
控制器 |
可一次性移动的字节数* |
---|---|
M258、LMC058、M241、M251 |
2048 字节 |
PacDrive LMC、M262 |
>10 000 000 个字节(受到应用内存的限制) |
*这是缓冲区大小与填充水平之间的最大差值。 |