Я пытаюсь реализовать долгосрочное TCP-соединение с ninnenine ranch
библиотека эрланга .
Но, глядя на документацию, я не вижу способа сделать это.
Также я написал свой собственный протокол ранчо, как показано ниже
start_link(Ref, _Socket, Transport, Opts) ->
Pid = spawn_link(?MODULE, init, [Ref, Transport, Opts]),
{ok, Pid}.
init(Ref, Transport, _Opts = []) ->
{ok, Socket} = ranch:handshake(Ref),
loop(Socket, Transport).
loop(Socket, Transport) ->
case Transport:recv(Socket, 0, 5000) of
{ok, Data} when Data =/= <<4>> ->
%% Transport:send(Socket, Data),
io:format("~w Connction accpted~n", [Data]);
_ -> ok
%%, Transport:close(Socket)
end.
Как вы можете видеть, я прокомментировал Transport:close(Socket)
, и я не отправляю никакого ответа клиенту, так как Transsport:send(socket,Data)
также прокомментировал мысль, что это решит проблему, но все же, мои соединения закрываются немедленно, так как открыл. у меня есть клиент golang, показанный ниже
package main
import (
"fmt"
"log"
"net"
)
func main(){
conn, err := net.Dial("tcp", "localhost:5555")
if err != nil {
fmt.Println(err)
}
fmt.Println(conn /*, i*/)
conn.Write(XMLData)
buffer := make([]byte, 10024)
n, err := conn.Read(buffer)
fmt.Println(buffer[:n])
//conn.Close()
}
Хотя это было время на ранчо, из-за этого. Я искал и обнаружил, что на ранчо в файле src / ranch_tcp.erl реализована функция прослушивания, как показано ниже
listen(Opts) ->
Opts2 = ranch:set_option_default(Opts, backlog, 1024),
Opts3 = ranch:set_option_default(Opts2, nodelay, true),
Opts4 = ranch:set_option_default(Opts3, send_timeout, 30000),
Opts5 = ranch:set_option_default(Opts4, send_timeout_close, true),
%% We set the port to 0 because it is given in the Opts directly.
%% The port in the options takes precedence over the one in the
%% first argument.
gen_tcp:listen(0, ranch:filter_options(Opts5, disallowed_listen_options(),
[binary, {active, false}, {packet, raw}, {reuseaddr, true}])).
Как вы можете видеть, есть опция тайм-аута, а именно Opts5 Opts5 = ranch:set_option_default(Opts4, send_timeout_close, true)
и Opts4 Opts4 = ranch:set_option_default(Opts3, send_timeout, 30000),
. Я их отключил, но все еще не работает. Так что я должен сделать, чтобы иметь долгое живое соединение TCP, используя ранчо.