使用ninenine ranch实现长寿tcp连接

使用ninenine ranch实现长寿tcp连接,tcp,erl,ranch,Tcp,Erl,Ranch,我正在尝试实现与的长寿TCP连接。 但是看看这些文档,我看不出有什么方法可以做到这一点。 我还编写了自己的牧场协议,如下所示 start_link(Ref, _Socket, Transport, Opts) -> Pid = spawn_link(?MODULE, init, [Ref, Transport, Opts]), {ok, Pid}. init(Ref, Transport, _Opts = []) ->

我正在尝试实现与的长寿TCP连接。 但是看看这些文档,我看不出有什么方法可以做到这一点。 我还编写了自己的牧场协议,如下所示

   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.
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()

    }
我还以为是在牧场的一段时间造成的呢。我搜索了一下,发现在ranch中,在src/ranch_tcp.erl文件中,我们实现了函数listen,如下所示

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\u default(Opts4,send_timeout\u close,true)
和Opts4
Opts4=ranch:set_option\u default(Opts3,send_timeout,30000),
。我禁用了它们,但仍然不起作用。那么,我应该怎么做才能使用ranch实现tcp连接的长寿命呢

您的协议实现存在缺陷

循环(套接字、传输)->
箱子运输:recv(插座,0.5000)的
{ok,Data}当Data=/=->
%%传输:发送(套接字、数据),
io:格式(“~w连接已接受~n”,[Data]);
_->好的
%%,运输:关闭(插座)
结束。

在任何case子句分支中都不会递归调用
loop/2
,因此当
loop/2
返回导致tcp连接中断时,您的协议进程将终止