查看源代码 diameter_tcp (diameter v2.4.1)

通过 TCP 的 Diameter 传输。

此模块使用 gen_tcp 实现通过 TCP 的 diameter 传输。它可以指定为 diameter:add_transport/2transport_module 选项的值,并实现 diameter_transport 中记录的行为。支持 TLS 安全,可以在能力交换后升级,或者在连接建立时就使用。

请注意,TLS 需要 ssl 应用程序,并且必须在 diameter 传输上配置 TLS 功能之前启动。

另请参阅

diameter, diameter_transport, gen_tcp, inet, ssl

摘要

函数

start({Type, Ref}, Svc, [Opt]) -> {ok, Pid} | {ok, Pid, [LAddr]} | {error, Reason}

类型

链接到此类型

connect_option()

查看源代码 (自 OTP R14B03 起)
-type connect_option() ::
          {raddr, inet:ip_address()} |
          {rport, pos_integer()} |
          {ssl_options, true | [ssl:tls_client_option()]} |
          option() |
          ssl:tls_client_option() |
          gen_tcp:connect_option().
链接到此类型

listen_option()

查看源代码 (自 OTP R14B03 起)
-type listen_option() ::
          {accept, match()} |
          {ssl_options, true | [ssl:tls_server_option()]} |
          option() |
          ssl:tls_server_option() |
          gen_tcp:listen_option().
链接到此类型

match()

查看源代码 (未导出) (自 OTP R14B03 起)
-type match() :: inet:ip_address() | string() | [match()].
链接到此类型

option()

查看源代码 (未导出) (自 OTP R14B03 起)
-type option() ::
          {port, non_neg_integer()} |
          {sender, boolean()} |
          sender |
          {message_cb, false | diameter:eval()} |
          {fragment_timer, 0..4294967295}.

函数

链接到此函数

start/3

查看源代码 (自 OTP R14B03 起)
-spec start({accept, Ref},
            #diameter_service{pid :: term(), capabilities :: term(), applications :: term()},
            [listen_option()]) ->
               {ok, pid(), [inet:ip_address()]}
               when Ref :: diameter:transport_ref();
           ({connect, Ref},
            #diameter_service{pid :: term(), capabilities :: term(), applications :: term()},
            [connect_option()]) ->
               {ok, pid()}
               when Ref :: diameter:transport_ref().

start({Type, Ref}, Svc, [Opt]) -> {ok, Pid} | {ok, Pid, [LAddr]} | {error, Reason}

diameter_transport 要求的启动函数。

选项 raddrrport 指定连接传输的远程地址和端口,对于侦听传输无效。

选项 accept 指定侦听传输的远程地址,对于连接传输无效。如果指定,则与指定地址不匹配的远程地址将导致连接中止。可以指定多个 accept 选项。一个未解析为地址的字符串值 Match 被解释为正则表达式。

必须为应支持 TLS 的传输指定选项 ssl_options:值 true 会在连接建立后立即进行 TLS 握手,而 list/0 指定在协商 TLS 后传递给 ssl:connect/2ssl:handshake/2 的选项。

选项 fragment_timer 指定一个定时器的超时时间(以毫秒为单位),该定时器用于从传入的字节流中刷新消息,即使其 Diameter 标头的消息长度字段中指示的字节数尚未累积:在没有接收到其他字节的情况下,经过两次连续超时后,此类消息将通过传输接口接收。默认为 1000。

选项 sender 指定是否使用专用进程发送传出消息,这避免了发送阻塞接收的可能性。默认为 false。如果设置为 true,则应配置一个 message_cb,以避免消息在发送进程中无限排队。

选项 message_cb 指定一个回调函数,该函数在传入和传出消息时调用,可用于实现流量控制。它应用于两个参数:一个表示回调原因的原子(sendrecv 或完成发送后的 ack),以及有问题的消息(recv 上的 binary(),sendack 上的 binary() 或 diameter_packet 记录,或者在传入请求被丢弃时 ack 上的 false)。它应返回一个操作列表和一个新的回调作为尾部;例如,[fun cb/3, State]。有效操作是原子 sendrecv,以使以下消息值操作被发送/接收,一个要发送/接收的消息(binary() 或 diameter_packet 记录),或者一个 boolean() 以启用/禁用套接字上的读取。可以从同一回调返回多个 send/recv/消息序列,如果与作为回调的第一个参数传递的值相同,则可以省略初始的 send/recv。读取最初是启用的,并且返回 false 并不意味着不能有后续的 recv 回调,因为消息可能已经被读取。空尾部等效于当前回调。默认为一个等效于 `fun(ack, _) -> []; (_, Msg) -> [Msg] end` 的回调。

其余选项是 ssl:connect/3gen_tcp:connect/3 (对于连接传输) 或 ssl:listen/2gen_tcp:listen/2 (对于侦听传输) 接受的任何选项,具体取决于是否指定了 {ssl_options, true}。无法指定选项 binarypacketactive。此外,可以为侦听传输指定选项 port 以指定本地侦听端口,默认为标准化的 3868。请注意,选项 ip 指定本地地址。

当且仅当相关传输将 Inband-Security-Id 设置为 1 (TLS) 时,必须指定 ssl_options 列表,如在 diameter:start_service/2diameter:add_transport/2 中指定的,以便传输进程将收到是否在功能交换后开始 TLS 握手的通知。在协商 TLS 时,未能为支持 TLS 的传输指定选项列表会导致 TLS 握手失败。如果在指定 ssl_options 时未能指定 TLS 功能,将导致传输进程等待不会发生的通知,最终将导致 RFC 3539 监视器关闭连接。

如果未指定 ip 选项,则 Svc 中非空 Host-IP-Address 列表的第一个元素提供本地 IP 地址。本地地址从 start/3 返回,或通过传输接口在 connected 消息中传递。