gpt4 book ai didi

tcp - 使用 ninenine ranch 实现 Long live tcp 连接

转载 作者:可可西里 更新时间:2023-11-01 02:53:11 25 4
gpt4 key购买 nike

我正在尝试使用 ninnenine ranch erlang library 实现长期有效的 TCP 连接.但是查看文档我看不到这样做的方法。我还编写了自己的牧场协议(protocol),如下所示

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

}

我虽然是在牧场超时造成的。我搜索了一下,发现在 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_default(Opts4, send_timeout_close, true) 和 Opts4 Opts4 = ranch:set_option_default(Opts3, send_timeout, 30000) ,。我禁用了它们但仍然无法正常工作。那么我应该怎么做才能使用 ranch 建立长期有效的 tcp 连接。

最佳答案

你的协议(protocol)实现有缺陷

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.

您不调用 loop/2在你的任何 case 子句分支中递归,因此你的协议(protocol)进程在 loop/2 时终止返回使 tcp 连接中断。

关于tcp - 使用 ninenine ranch 实现 Long live tcp 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54172418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com