Skip to content

Instantly share code, notes, and snippets.

@rlipscombe
Created August 17, 2015 16:30
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rlipscombe/c8f92f47fe1e0ecba757 to your computer and use it in GitHub Desktop.
Save rlipscombe/c8f92f47fe1e0ecba757 to your computer and use it in GitHub Desktop.
ssl:setopts (keepalive)
%% from /usr/include/netinet/in.h (Linux and OS X)
-define(IPPROTO_TCP, 6).
%% from /usr/include/netinet/tcp.h (Linux)
-define(TCP_MAXSEG, 2).
-define(TCP_KEEPIDLE, 4).
-define(TCP_KEEPINTVL, 5).
-define(TCP_KEEPCNT, 6).
%% @doc If you pass multiple raw options to ssl:listen, it appears to drop all
%% but one of them. Instead, we call setopts directly.
enable_keepalive(_Socket, []) ->
ok;
enable_keepalive(Socket, [Opt = {keepalive, true}|Rest]) ->
ssl:setopts(Socket, [Opt]),
enable_keepalive(Socket, Rest);
enable_keepalive(Socket, [{keepalive_time, Secs}|Rest]) ->
Opt = {raw, ?IPPROTO_TCP, ?TCP_KEEPIDLE, <<Secs:32/native>>},
ssl:setopts(Socket, [Opt]),
enable_keepalive(Socket, Rest);
enable_keepalive(Socket, [{keepalive_intvl, Secs}|Rest]) ->
Opt = {raw, ?IPPROTO_TCP, ?TCP_KEEPINTVL, <<Secs:32/native>>},
ssl:setopts(Socket, [Opt]),
enable_keepalive(Socket, Rest);
enable_keepalive(Socket, [{keepalive_probes, Count}|Rest]) ->
Opt = {raw, ?IPPROTO_TCP, ?TCP_KEEPCNT, <<Count:32/native>>},
ssl:setopts(Socket, [Opt]),
enable_keepalive(Socket, Rest);
enable_keepalive(Socket, [_|Rest]) ->
enable_keepalive(Socket, Rest).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment