查看源代码 diameter_tcp (diameter v2.4.1)
通过 TCP 的 Diameter 传输。
此模块使用 gen_tcp
实现通过 TCP 的 diameter 传输。它可以指定为 diameter:add_transport/2
的 transport_module
选项的值,并实现 diameter_transport
中记录的行为。支持 TLS 安全,可以在能力交换后升级,或者在连接建立时就使用。
请注意,TLS 需要 ssl 应用程序,并且必须在 diameter 传输上配置 TLS 功能之前启动。
另请参阅
摘要
类型
-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().
-type listen_option() :: {accept, match()} | {ssl_options, true | [ssl:tls_server_option()]} | option() | ssl:tls_server_option() | gen_tcp:listen_option().
-type match() :: inet:ip_address() | string() | [match()].
-type option() :: {port, non_neg_integer()} | {sender, boolean()} | sender | {message_cb, false | diameter:eval()} | {fragment_timer, 0..4294967295}.
函数
-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
要求的启动函数。
选项 raddr
和 rport
指定连接传输的远程地址和端口,对于侦听传输无效。
选项 accept
指定侦听传输的远程地址,对于连接传输无效。如果指定,则与指定地址不匹配的远程地址将导致连接中止。可以指定多个 accept
选项。一个未解析为地址的字符串值 Match
被解释为正则表达式。
必须为应支持 TLS 的传输指定选项 ssl_options
:值 true
会在连接建立后立即进行 TLS 握手,而 list/0
指定在协商 TLS 后传递给 ssl:connect/2
或 ssl:handshake/2
的选项。
选项 fragment_timer
指定一个定时器的超时时间(以毫秒为单位),该定时器用于从传入的字节流中刷新消息,即使其 Diameter 标头的消息长度字段中指示的字节数尚未累积:在没有接收到其他字节的情况下,经过两次连续超时后,此类消息将通过传输接口接收。默认为 1000。
选项 sender
指定是否使用专用进程发送传出消息,这避免了发送阻塞接收的可能性。默认为 false
。如果设置为 true
,则应配置一个 message_cb
,以避免消息在发送进程中无限排队。
选项 message_cb
指定一个回调函数,该函数在传入和传出消息时调用,可用于实现流量控制。它应用于两个参数:一个表示回调原因的原子(send
、recv
或完成发送后的 ack
),以及有问题的消息(recv
上的 binary(),send
或 ack
上的 binary() 或 diameter_packet 记录,或者在传入请求被丢弃时 ack
上的 false
)。它应返回一个操作列表和一个新的回调作为尾部;例如,[fun cb/3, State]
。有效操作是原子 send
或 recv
,以使以下消息值操作被发送/接收,一个要发送/接收的消息(binary() 或 diameter_packet 记录),或者一个 boolean() 以启用/禁用套接字上的读取。可以从同一回调返回多个 send
/recv
/消息序列,如果与作为回调的第一个参数传递的值相同,则可以省略初始的 send
/recv
。读取最初是启用的,并且返回 false
并不意味着不能有后续的 recv
回调,因为消息可能已经被读取。空尾部等效于当前回调。默认为一个等效于 `fun(ack, _) -> []; (_, Msg) -> [Msg] end` 的回调。
其余选项是 ssl:connect/3
或 gen_tcp:connect/3
(对于连接传输) 或 ssl:listen/2
或 gen_tcp:listen/2
(对于侦听传输) 接受的任何选项,具体取决于是否指定了 {ssl_options, true}
。无法指定选项 binary
、packet
和 active
。此外,可以为侦听传输指定选项 port
以指定本地侦听端口,默认为标准化的 3868。请注意,选项 ip
指定本地地址。
当且仅当相关传输将 Inband-Security-Id
设置为 1 (TLS
) 时,必须指定 ssl_options
列表,如在 diameter:start_service/2
或 diameter:add_transport/2
中指定的,以便传输进程将收到是否在功能交换后开始 TLS 握手的通知。在协商 TLS 时,未能为支持 TLS 的传输指定选项列表会导致 TLS 握手失败。如果在指定 ssl_options
时未能指定 TLS 功能,将导致传输进程等待不会发生的通知,最终将导致 RFC 3539 监视器关闭连接。
如果未指定 ip
选项,则 Svc
中非空 Host-IP-Address
列表的第一个元素提供本地 IP 地址。本地地址从 start/3
返回,或通过传输接口在 connected
消息中传递。