【问题标题】:How build non-blocking TCP server with ssl encryption如何使用 ssl 加密构建非阻塞 TCP 服务器
【发布时间】:2010-11-30 01:17:49
【问题描述】:

Non-blocking TCP server on trapexit.org 解释了如何基于 tcp_gen 构建服务器,但我想修改此示例并使其与 ssl 一起使用。现在我完全不知道如何替换

{ok, Ref} = prim_inet:async_accept(Listen_socket, -1)

【问题讨论】:

  • SSL 不会是堆栈中高于此的层吗?传输仍然是 TCP。

标签: erlang erlang-otp


【解决方案1】:

带有多线程的简单 echo_ssl

-module(echo_ssl).
-compile([export_all]).

main() ->
    application:start(crypto),
    application:start(ssl),
    ssl:seed("TODO random here"),
    {ok, ListenSocket} = ssl:listen(2840, [
        {ssl_imp, new},
        {active, false},
        {verify, 0},
        {mode,binary},
        {cacertfile, "certs/etc/server/cacerts.pem"},
        {certfile, "certs/etc/server/cert.pem"},
        {keyfile, "certs/etc/server/key.pem"}
    ]),
    io:format("ready to accept connections at port 2840 ~p\n", [ListenSocket]),
    server_loop(ListenSocket).

server_loop(ListenSocket) ->
    {ok, Socket} = ssl:transport_accept(ListenSocket),
    io:format("accepted connection from ~p\n", [ssl:peername(Socket)]),
    ssl:ssl_accept(Socket),
    spawn(fun() -> loop(Socket) end),
    server_loop(ListenSocket).

loop(Socket) ->
    io:format("waiting for packet~n"),
    case ssl:recv(Socket, 1000, 2000) of
        {ok, Data} ->
            io:format("received data: ~s~n", [binary_to_list(Data)]),
            Return = ssl:send(Socket, Data),
            io:format("sending ~p~n", [Return]),
            loop(Socket);
        {error, timeout} ->
           loop(Socket);
        Else ->
            io:format("crap ~p~n",[Else])
    end.

【讨论】:

    【解决方案2】:

    不要用任何东西代替它。而是将您的输入和输出连接到 SSL 处理程序。

    spender 是对的,SSL 使用 TCP 进行传输。

    这里似乎有人实现了SSL over async TCP

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 2019-09-12
      • 2017-11-12
      • 2012-02-11
      • 2019-10-30
      • 1970-01-01
      • 2022-12-09
      相关资源
      最近更新 更多