Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang 如何确保使用ssl发送消息_Erlang - Fatal编程技术网

Erlang 如何确保使用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} ->

我正在实现一个gen_服务器,它作为ssl身份验证服务器的接口。如果收到的数据包错误(例如错误的用户名和密码),ssl服务器将断开连接。连接必须是持久的

在gen_服务器中,我使用句柄\u cast/2打开与服务器的ssl连接:

 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攻击

  • 据我所知,系统中只有一个身份验证服务器,为什么您不能在gen_服务器的init中直接连接到它?如果连接有点可靠,您可以在连接出现任何问题时关闭gen_server,然后让supervisor重新启动它。它可能会解决您的DOS问题
  • 当您使用send_auth生成其他进程时,您只需在参数中传递套接字连接,而不用执行gen_服务器调用
  • 为了保证交付,您将在协议中添加某种确认。身份验证服务器应该回复send_Auth,并确认收到了它。而发送\u auth应该重试,直到它收到确认,或者有一些其他回退行为,以防它从来没有这样做
  • 据我所知,系统中只有一个身份验证服务器,为什么您不能在gen_服务器的init中直接连接到它?如果连接有点可靠,您可以在连接出现任何问题时关闭gen_server,然后让supervisor重新启动它。它可能会解决您的DOS问题
  • 当您使用send_auth生成其他进程时,您只需在参数中传递套接字连接,而不用执行gen_服务器调用
  • 为了保证交付,您将在协议中添加某种确认。身份验证服务器应该回复send_Auth,并确认收到了它。而发送\u auth应该重试,直到它收到确认,或者有一些其他回退行为,以防它从来没有这样做