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


erlang getopts(Socket, Options)用法及代码示例


getopts(Socket, Options) -> {ok, OptionValues} | {error, posix()}
类型:
Socket = socket()
Options = [socket_getopt()]
OptionValues = [socket_optval()]

获取套接字的一个或多个选项。有关可用 inet 选项的列表,请参见setopts/2。另请参阅引用的协议特定类型的说明 socket_optval() .

返回的 OptionValues 列表中的元素数量不一定与要求的选项数量相对应。如果操作系统不支持某个选项,则该选项将被排除在返回的列表中。仅当无法获取套接字的选项时(即套接字已关闭或原始请求中的缓冲区大小太大),才会返回错误元组。出于向后兼容性的原因保留此行为。

原始选项请求 RawOptReq = {raw, Protocol, OptionNum, ValueSpec} 可用于获取有关模拟器未(明确)支持的套接字选项的信息。使用原始套接字选项使代码不可移植,但允许 Erlang 程序员利用特定平台上存在的不寻常函数。

RawOptReq 由标记 raw 组成,后跟协议级别、选项号以及要存储选项值的缓冲区的二进制或大小(以字节为单位)。当底层 getsockopt 需要在参数字段中输入时,将使用二进制文件。在这种情况下,二进制大小将对应于返回值所需的缓冲区大小。 RawOptReq 中提供的值对应于 C 套接字 API 中 getsockopt 调用的第二个、第三个和第四个/第五个参数。存储在缓冲区中的值以二进制 ValueBin 形式返回,其中所有值均按本机字节序进行编码。

请求和检查原始套接字选项需要有关当前操作系统和 TCP 堆栈的低级信息。

例子:

考虑一台 Linux 机器,其中选项 TCP_INFO 可用于收集套接字的 TCP 统计信息。假设您对在请求 TCP_INFO 时填写的 struct tcp_info 字段 tcpi_sacked 感兴趣。为了能够访问此信息,您需要了解以下信息:

  • 协议级别的数值IPPROTO_TCP
  • 选项TCP_INFO的数值
  • struct tcp_info的大小
  • 特定字段的大小和偏移量

通过检查头文件或编写一个小C程序,发现IPPROTO_TCP为6,TCP_INFO为11,结构体大小为92(字节),tcpi_sacked的偏移量为28字节,值为32 位整数。以下代码可用于检索该值:

get_tcpi_sacked(Sock) ->
    {ok,[{raw,_,_,Info}]} = inet:getopts(Sock,[{raw,6,11,92}]),
    <<_:28/binary,TcpiSacked:32/native,_/binary>> = Info,
    TcpiSacked.

最好在执行与此代码类似的任何内容之前检查机器类型、操作系统和内核版本。

相关用法


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