У меня есть TCP-сервер, который прослушивает Ip: Port.
listen(Ip, Port) ->
Opts = [
binary,
{active, false},
{packet, 0},
{reuseaddr, true},
{ip, Ip}
],
case gen_tcp:listen(Port, Opts) of
{ok, ListenSock} ->
?MODULE:loop_accept(ListenSock);
{error, Reason} ->
exit(Reason)
end.
loop_accept(ListenSock) ->
{ok, Sock} = gen_tcp:accept(ListenSock),
?MODULE:loop(Sock),
?MODULE:loop_accept(ListenSock).
loop(Sock) ->
case gen_tcp:recv(Sock, 0) of
{ok, Data} ->
gen_tcp:send(Sock, [<<"Response: ">>, Data]),
?MODULE:loop(Sock);
{error, Reason} ->
ok
end.
Задача: когда один клиент подключен к Ip: Port (например, telnet Ip Port
), другой клиент, пытающийся установить соединение, должен быть сброшен.Другими словами, эксклюзивное использование Ip: Port.
Вопросы:
- Как это реализовано на Erlang с использованием модуля gen_tcp?
- Возможно решить с помощью параметровgen_tcp: listen?
- Как программно сбросить пробное соединение в Erlang?
PS Я новичок в erlang.