之前在网上找到 socket 函数的说明,但是这两个函数并没有详细介绍,所以根据官方文档整理了一下

1. lrs_length_receive

1. 函数说明

接收来自指定长度的缓冲区的数据,主要步骤是先确定长度数据位置,获取到长度数据,然后根据长度数据去获取实际数据。

2. 函数格式

int lrs_length_receive(char **socket_descriptor*, char **buffer*, int *location_option*,
[char* *locators*], [char* *additional_params*],LrsLastArg );

3. 参数说明:

4. 返回值

成功返回 0,否则返回错误码。

5. 用法举例

例子 1

下面的例子用location_option=1的方式来说明,buffer1包含2字节的长度数据(粗体)和实际的数据

首先得到长度数据51之后,lrs_length_receive继续从socket0读取51字节的数据到buffer2,注意这里不需要设置 offset,使用默认值即可。

buffer1

51aaabbccdddeeeeeeeeeeeeeeffffffffffffgggggghhhhhhhi

lrs_create_socket("socket0","TCP", "RemoteHost=bona.mercury.com:7", LrsLastArg); 
lrs_send("socket0","buffer1", LrsLastArg); 
lrs_length_receive("socket0","buffer2", OffsetSize, "Size=2", LrsLastArg); 

这个例子:

例子 2

这个例子使用location_option=2的定位方式,左边界LLLL,右边界RRRR,序数设置为2(表示以第二个LLLL作为左边界),偏移量设置为27(表示从黑体开始往右偏移27字节),根据右边界RRRR可以判定长度数据为9(黑体),然后函数继续读取右边界后面开始的 9 个字节的数据,在这里为Requested,将数据存入buff4lrs_receive将剩下的数据存入buffer

buffer3
12LLLL34*LLLLOOOOOfffffsssssseeeeeTTTTTT9*RRRRRequestedZZZZZZZZZZZZZZZZZZZZ2LLLLAAAAAAAAAAAAAAAAAAAAAAEndBuf

lrs_create_socket("socket0","TCP", "RemoteHost=bona.mercury.com:7", LrsLastArg); 
lrs_send("socket0","buffer3", LrsLastArg); 
lrs_length_receive("socket0","buffer4", 2, "LB=LLLL", "RB=RRRR","Offset=27", "Ordinal=2", LrsLastArg); 
// 获取剩余数据
lrs_receive("socket0","buffer5", LrsLastArg); 

这个例子:

例子 3

这个例子使用location_option=2的定位方式,设置左边界\\x00\\x00\\x00\\x07,然后根据偏移量设置Offset=7往后便宜7个字节,根据长度设置size=2取出 2 字节的长度数据16,由于设置了SubtractSize=1,所以需要减去本身的长度2(所以实际要获取的长度为16-2=14),所以获取数字16以后的14的字节,在这个例子中为RequestedData,最后用lrs_receive获取剩下的数据。

buffer6
12LLLL34*\x00\x00\x00\x07eTTTTTT16*RequestedDataZZZZZZZZZZZZZZZZZZZZ2LLLLAAAAAAAAAAAAAAAAAEndBuf

lrs_create_socket("socket0","TCP", "RemoteHost=bona.mercury.com:7", 
lrs_send("socket0","buffer6", LrsLastArg); 
lrs_length_receive("socket0","buffer7", 3, "LB/BIN=\\x00\\x00\\x00\\x07","size=2", "Offset=7", "SubtractSize=0",LrsLastArg); 

这个例子:

6. 函数详细说明

函数读取指定长度的数据到buffer,长度数据在数据本身里面,用户必须清楚的知道长度数据的具体位置,并使用location_optionlocators两个参数来指定长度数据的具体位置,lrs_length_receive首先得到长度数据,然后根据长度数据读取相应的数据到buffer

location_option参数说明

Locator联合起来定位长度数据的位置,如:"LB=LeftLeft ", "Size=1","Offset=18"

Ordinal 参数

额外的参数

2. lrs_length_send

1. 函数说明

向流套接字发送指定长度的缓冲区数据

2. 函数格式

int lrs_length_send(char **socket_descriptor*, char **buffer*, int *location_option*,
[char* *locators*], [char* *additional_params*],LrsLastArg );

3. 参数说明

4. 返回值

成功返回 0,否则返回错误码。

5. 用法举例

在这个例子中,buf6通过socket0发送,数据使用了参数化,NameParameter是一个参数,从一系列的数据中取值。 4是长度数据,但是,随着参数NameParameter变化,长度也在随着变化,比如:David长度应该改为5Michael长度应该改为7

buf6

Start Data LBoundary & Offset:4:RBoundary

#include "lrs.h"
Action() {
lrs_create_socket("socket0","TCP","RemoteHost=bonaparte.mercury.co.il:7",LrsLastArg);
lrs_length_send("socket0","buf6",LeftRightBoundaries,"LB=LBoundary","RB=:RBoundary", "Offset=10",LrsLastArg);
lrs_close_socket("socket0");
return 0;
}

通过lrs_length_send可以实现下面的动态发送数据。

===SENT BUFFER (on first iteration) ===
"Start Data LBoundary & Offset:5:RBoundaryDavid"

===SENT BUFFER (on second iteration) ===
"Start Data LBoundary & Offset:7:RBoundaryMichael"

在这个例子中

6. 函数详细说明

这个函数大部分参数跟lrs_length_receive相同。

lrs_length_send可以用来发送指定长度的数据,这在发送数据中包含参数化数据的时候很有用,因为每次发送的数据长度不一致,通过函数可以在每次发送数据之前将正确的长度写入到发送数据中去。

长度数据的查找方法跟lrs_length_receive类似,也是通过locatorlocation_option两个参数来定位。

在调用函数之前,用户必须明确知道长度数据在哪里,函数首先计算长度,然后写入长度规定的字节数到缓冲区发送出去。

socket_descriptor,buffer

这两个参数跟lrs_send完全一致。

location_option(定位模式)

Locator 参数

关于 Offset 参数的用法,Ordinal 的用法,以及附加参数的用法同函数 lrs_length_receive


↙↙↙阅读原文可查看相关链接,并与作者交流