From 53857bc613224be3cb6e5864aefc8bd1f2fa033f Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Tue, 25 Feb 2025 15:57:26 +0000 Subject: [PATCH] Fix message dropping issue on server The sockets were initially set to active, which meant that data received immediately after the TLS handshake (before the socket was transferred to the handle_connection process) were received by the acceptor process and hence were not handled. --- server/src/tcp_server.erl | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/server/src/tcp_server.erl b/server/src/tcp_server.erl index 2714c29..80133d8 100644 --- a/server/src/tcp_server.erl +++ b/server/src/tcp_server.erl @@ -14,12 +14,12 @@ start_link(Port, CertDir) -> gen_server:start_link({local, ?MODULE}, ?MODULE, [Port, CertDir], []). init([Port, CertDir]) -> + TcpOpts = [binary, inet6, {active, false}, {reuseaddr, true}], SslOpts = [{certfile, filename:join([CertDir, "server.pem"])}, {cacertfile, filename:join([CertDir, "ca.pem"])}, {verify, verify_peer}, {fail_if_no_peer_cert, true}], - {ok, Socket} = - ssl:listen(Port, [binary, inet6, {active, true} | SslOpts]), + {ok, Socket} = ssl:listen(Port, TcpOpts ++ SslOpts), Pid = spawn_link(fun() -> acceptor_loop(Socket) end), {ok, #state{socket = Socket, acceptor = Pid}}. @@ -49,7 +49,6 @@ acceptor_loop(Socket) -> Pid = spawn( fun() -> handle_connection(ClientSocket) end), ok = ssl:controlling_process(ClientSocket, Pid), - ssl:setopts(ClientSocket, [{active, true}]), acceptor_loop(Socket); {error, _Reason} -> acceptor_loop(Socket) @@ -59,10 +58,17 @@ acceptor_loop(Socket) -> end. handle_connection(Socket) -> + ssl:setopts(Socket, [{active, true}]), + handle_connection_loop(Socket). + +handle_connection_loop(Socket) -> receive {ssl, Socket, Data} -> - ssl:send(Socket, Data), - handle_connection(Socket); + handle_client_msg(Socket, Data), + handle_connection_loop(Socket); {ssl_closed, Socket} -> ok end. + +handle_client_msg(Socket, Msg) -> + ssl:send(Socket, Msg).