当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


erlang decode_packet(Type, Bin, Options)用法及代码示例


erlang:decode_packet(Type, Bin, Options) ->
                        {ok, Packet, Rest} |
                        {more, Length} |
                        {error, Reason}
类型:
Type = 
    raw | 0 | 1 | 2 | 4 | asn1 | cdr | sunrm | fcgi | tpkt |
    line | http | http_bin | httph | httph_bin
Bin = binary()
Options = [Opt]
Opt = 
    {packet_size, integer() >= 0} |
    {line_length, integer() >= 0}
Packet = binary() | HttpPacket
Rest = binary()
Length = integer() >= 0 | undefined
Reason = term()
HttpPacket = 
    HttpRequest | HttpResponse | HttpHeader | http_eoh | HttpError
HttpRequest = {http_request, HttpMethod, HttpUri, HttpVersion}
HttpResponse = 
    {http_response, HttpVersion, integer(), HttpString}
HttpHeader = 
    {http_header,
 integer(),
     HttpField,
     UnmodifiedField :: HttpString,
     Value :: HttpString}
HttpError = {http_error, HttpString}
HttpMethod = 
    'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' |
    'TRACE' | HttpString
HttpUri = 
    '*' |
    {absoluteURI,
     http | https,
     Host :: HttpString,
     Port :: inet:port_number() | undefined,
     Path :: HttpString} |
    {scheme, Scheme :: HttpString, HttpString} |
    {abs_path, HttpString} |
    HttpString
HttpVersion = 
    {Major :: integer() >= 0, Minor :: integer() >= 0}
HttpField = 
    'Cache-Control' | 'Connection' | 'Date' | 'Pragma' |
    'Transfer-Encoding' | 'Upgrade' | 'Via' | 'Accept' |
    'Accept-Charset' | 'Accept-Encoding' | 'Accept-Language' |
    'Authorization' | 'From' | 'Host' | 'If-Modified-Since' |
    'If-Match' | 'If-None-Match' | 'If-Range' |
    'If-Unmodified-Since' | 'Max-Forwards' |
    'Proxy-Authorization' | 'Range' | 'Referer' | 'User-Agent' |
    'Age' | 'Location' | 'Proxy-Authenticate' | 'Public' |
    'Retry-After' | 'Server' | 'Vary' | 'Warning' |
    'Www-Authenticate' | 'Allow' | 'Content-Base' |
    'Content-Encoding' | 'Content-Language' | 'Content-Length' |
    'Content-Location' | 'Content-Md5' | 'Content-Range' |
    'Content-Type' | 'Etag' | 'Expires' | 'Last-Modified' |
    'Accept-Ranges' | 'Set-Cookie' | 'Set-Cookie2' |
    'X-Forwarded-For' | 'Cookie' | 'Keep-Alive' |
    'Proxy-Connection' | HttpString
HttpString = string() | binary()

根据 Type 指定的数据包协议解码二进制 Bin 。类似于带有选项 {packet,Type}. 的套接字完成的数据包处理

如果整个数据包包含在 Bin 中,则它将与二进制文件的其余部分一起作为 {ok,Packet,Rest} 返回。

如果Bin不包含整个数据包,则返回{more,Length}Length 是数据包的预期总大小,如果预期数据包大小未知,则为 undefined。然后可以再次调用decode_packet并添加更多数据。

如果报文不符合协议格式,则返回{error,Reason}

Type s:


raw | 0

不进行数据包处理。除非它为空,否则将返回整个二进制文件。


1 | 2 | 4

数据包包含一个标头,指定数据包中的字节数,后跟该字节数。标头的长度可以是 1、2 或 4 个字节;字节顺序是大端字节序。当数据包返回时,标头被剥离。


line

数据包是由分隔符字节组成的 line-terminated,默认为 latin-1 换行符。分隔符字节包含在返回的数据包中,除非该行根据选项 line_length 被截断。


asn1 | cdr | sunrm | fcgi | tpkt

标头没有被剥离。

报文类型的含义如下:


asn1 - ASN.1 BER

sunrm - Sun's RPC encoding

cdr - CORBA (GIOP 1.1)

fcgi - Fast CGI

tpkt - TPKT format [RFC1006]

http | httph | http_bin | httph_bin

超文本传输协议。返回的数据包格式符合前面说明的HttpPacket。数据包可以是请求、响应、标头或标头结束标记。无效行返回为 HttpError

识别的请求方法和标头字段作为原子返回。其他的则以字符串形式返回。无法识别的标头字段字符串的格式仅开头为大写字母,后面为连字符,例如 "Sec-Websocket-Key" 。标头字段名称也在 UnmodifiedField 中以字符串形式返回,无需任何转换或格式化。

当需要 HttpRequestHttpResponse 时,协议类型 http 仅用于第一行。以下调用将使用 httph 获取 HttpHeader 直到返回 http_eoh,这标志着标头的结束和任何后续消息正文的开始。

变体 http_binhttph_bin 将字符串 ( HttpString ) 作为二进制文件而不是列表返回。

自 OTP 26.0 起,Host可能是包含在中的 IPv6 地址[],如定义RFC2732.

选项:


{packet_size, integer() >= 0}

设置数据包正文允许的最大大小。如果报文头指示报文的长度大于允许的最大长度,则认为该报文无效。默认为0,表示没有大小限制。


{line_length, integer() >= 0}

对于数据包类型 line ,超过指定长度的行将被截断。

如果 packet_size 本身未设置,选项 line_length 也适用于 http* 数据包类型,作为选项 packet_size 的别名。此用途仅用于向后兼容。


{line_delimiter, 0 =< byte() =< 255}

对于数据包类型 line ,设置分隔字节。默认为 latin-1 字符 $\n

例子:

> erlang:decode_packet(1,<<3,"abcd">>,[]).
{ok,<<"abc">>,<<"d">>}
> erlang:decode_packet(1,<<5,"abcd">>,[]).
{more,6}

相关用法


注:本文由纯净天空筛选整理自erlang.org大神的英文原创作品 decode_packet(Type, Bin, Options) -> {ok, Packet, Rest} | {more, Length} | {error, Reason}。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。