Erlang 如何确保使用ssl发送消息
我正在实现一个gen_服务器,它作为ssl身份验证服务器的接口。如果收到的数据包错误(例如错误的用户名和密码),ssl服务器将断开连接。连接必须是持久的 在gen_服务器中,我使用句柄\u cast/2打开与服务器的ssl连接:Erlang 如何确保使用ssl发送消息,erlang,Erlang,我正在实现一个gen_服务器,它作为ssl身份验证服务器的接口。如果收到的数据包错误(例如错误的用户名和密码),ssl服务器将断开连接。连接必须是持久的 在gen_服务器中,我使用句柄\u cast/2打开与服务器的ssl连接: handle_cast(connect, State) -> ...... case ssl:connect(Address, Port, Options, Timeout) of {ok, NewSocket} ->
handle_cast(connect, State) ->
......
case ssl:connect(Address, Port, Options, Timeout) of
{ok, NewSocket} ->
{noreply, State#state{socket=NewSocket}};
{error, Reason} ->
gen_server:cast(?SERVER, connect),
{noreply, State#state{socket=undefined}};
然后我在handle_cast/2中等待其他消息,这些消息可以通过以下方式发送:
gen_server:cast(Pid, {authenticate, User, Password}).
每当我收到这样一个cast消息时,我就会生成一个新函数,该函数使用gen_server:call/3从服务器状态恢复SSL套接字,并将身份验证消息发送到SSL服务器。如果发送部分返回错误,我将尝试重新连接,否则我将在套接字上读取一段时间,以确保套接字不会关闭,如果关闭,我将重新连接
send_auth(_, _, 0) ->
{error, max_num_reached};
send_auth(User, Password, Num) ->
Socket = gen_server:call(?SERVER, socket),
%% also a check that socket is not 'undefined'
case ssl:send(Socket, AuthMessage) of
ok ->
case ssl:recv(Socket, 0, 2000) of
{error, timeout} ->
ok;
_ ->
gen_server:cast(?SERVER, connect),
send_auth(User, Password, Num-1)
end,
{error, closed} ->
gen_server:cast(?SERVER, connect),
send_auth(User, Password, Num-1)
end.
我做了很多测试,但是每次,如果一条消息(不是最后一条)出错,那么下面的消息实际上都不会被传递
如何授予将所有有效的身份验证消息传递到身份验证服务器的权限?此外,如何确保服务器仅在尚未尝试连接时才会连接?否则那就像DOS攻击