erlang网络库
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 

118 rader
3.2 KiB

-module(ntCom).
-compile([export_all, nowarn_export_all]).
-spec mergeOpts(Defaults :: list(), Options :: list()) -> list().
mergeOpts(Defaults, Options) ->
lists:foldl(
fun({Opt, Val}, Acc) ->
lists:keystore(Opt, 1, Acc, {Opt, Val});
(Opt, Acc) ->
lists:usort([Opt | Acc])
end,
Defaults, Options).
mergeAddr({Addr, _Port}, SockOpts) ->
lists:keystore(ip, 1, SockOpts, {ip, Addr});
mergeAddr(_Port, SockOpts) ->
SockOpts.
getPort({_Addr, Port}) -> Port;
getPort(Port) -> Port.
fixIpPort(IpOrStr, Port) ->
if
is_list(IpOrStr), is_integer(Port) ->
{ok, IP} = inet:parse_address(v),
{IP, Port};
is_tuple(IpOrStr), is_integer(Port) ->
case isIpv4OrIpv6(IpOrStr) of
true ->
{IpOrStr, Port};
false ->
error({invalid_ip, IpOrStr})
end;
true ->
error({invalid_ip_port, IpOrStr, Port})
end.
parseAddr({Addr, Port}) when is_list(Addr), is_integer(Port) ->
{ok, IPAddr} = inet:parse_address(Addr),
{IPAddr, Port};
parseAddr({Addr, Port}) when is_tuple(Addr), is_integer(Port) ->
case isIpv4OrIpv6(Addr) of
true ->
{Addr, Port};
false ->
error(invalid_ipaddr)
end;
parseAddr(Port) ->
Port.
isIpv4OrIpv6({A, B, C, D}) ->
A >= 0 andalso A =< 255 andalso
B >= 0 andalso B =< 255 andalso
C >= 0 andalso C =< 255 andalso
D >= 0 andalso D =< 255;
isIpv4OrIpv6({A, B, C, D, E, F, G, H}) ->
A >= 0 andalso A =< 65535 andalso
B >= 0 andalso B =< 65535 andalso
C >= 0 andalso C =< 65535 andalso
D >= 0 andalso D =< 65535 andalso
E >= 0 andalso E =< 65535 andalso
F >= 0 andalso F =< 65535 andalso
G >= 0 andalso G =< 65535 andalso
H >= 0 andalso H =< 65535;
isIpv4OrIpv6(_) ->
false.
%% @doc Return true if the value is an ipv4 address
isIpv4({A, B, C, D}) ->
A >= 0 andalso A =< 255 andalso
B >= 0 andalso B =< 255 andalso
C >= 0 andalso C =< 255 andalso
D >= 0 andalso D =< 255;
isIpv4(_) ->
false.
%% @doc Return true if the value is an ipv6 address
isIpv6({A, B, C, D, E, F, G, H}) ->
A >= 0 andalso A =< 65535 andalso
B >= 0 andalso B =< 65535 andalso
C >= 0 andalso C =< 65535 andalso
D >= 0 andalso D =< 65535 andalso
E >= 0 andalso E =< 65535 andalso
F >= 0 andalso F =< 65535 andalso
G >= 0 andalso G =< 65535 andalso
H >= 0 andalso H =< 65535;
isIpv6(_) ->
false.
getListValue(Key, List, Default) ->
case lists:keyfind(Key, 1, List) of
false ->
Default;
{Key, Value} ->
Value
end.
serverName(PoolName, Index) ->
list_to_atom(atom_to_list(PoolName) ++ "_" ++ integer_to_list(Index)).
asName(tcp, PrName) ->
binary_to_atom(<<(atom_to_binary(PrName))/binary, "TAs">>);
asName(ssl, PrName) ->
binary_to_atom(<<(atom_to_binary(PrName))/binary, "SAs">>);
asName(udp, PrName) ->
binary_to_atom(<<(atom_to_binary(PrName))/binary, "UOs">>).
lsName(tcp, PrName) ->
binary_to_atom(<<(atom_to_binary(PrName))/binary, "TLs">>);
lsName(ssl, PrName) ->
binary_to_atom(<<(atom_to_binary(PrName))/binary, "SLs">>);
lsName(udp, PrName) ->
binary_to_atom(<<(atom_to_binary(PrName))/binary, "URs">>).