當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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}。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。