gpt4 book ai didi

使用 Erlang 的 gen_tcp 模块的 Elixir 上的 TCP 监听器

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

我正在使用以下代码在 elixir 上创建一个 TCP 监听器:

defmodule KVServer do
use Application

@doc false
def start(_type, _args) do
import Supervisor.Spec

children = [
supervisor(Task.Supervisor, [[name: KVServer.TaskSupervisor]]),
worker(Task, [KVServer, :accept, [4040]])
]

opts = [strategy: :one_for_one, name: KVServer.Supervisor]
Supervisor.start_link(children, opts)
end

@doc """
Starts accepting connections on the given `port`.
"""
def accept(port) do
{:ok, socket} = :gen_tcp.listen(port,
[:binary, packet: :line, active: false, reuseaddr: true])
IO.puts "Accepting connections on port #{port}"
loop_acceptor(socket)
end

defp loop_acceptor(socket) do
{:ok, client} = :gen_tcp.accept(socket)
{:ok, pid} = Task.Supervisor.start_child(KVServer.TaskSupervisor, fn -> serve(client) end)
:ok = :gen_tcp.controlling_process(client, pid)
loop_acceptor(socket)
end

defp serve(socket) do
socket
|> read_line()
|> write_line(socket)

serve(socket)
end

defp read_line(socket) do
{:ok, data} = :gen_tcp.recv(socket, 0)
data
end

defp write_line(line, socket) do
:gen_tcp.send(socket, line)
end
end

取自以下链接:http://elixir-lang.org/getting-started/mix-otp/task-and-gen-tcp.html

当我尝试使用 :gen_tcp.recv(socket,0) 从我的 gps 设备(我正在为其编写这段代码)获取数据时,出现错误:{:error, reason} = :gen_tcp.recv(socket, 0) 它显示的原因只是“关闭”。

但是,设备正在发送数据,我使用 tcp 数据包嗅探器 (tcpflow) 确认了这一点。

此外,当我尝试按照上述教程中的说明使用 telnet 发送数据时,它工作正常。

如有任何帮助,我们将不胜感激。

最佳答案

我终于明白了。实际上,该设备发送的是原始数据流,而不是数据行。所以我不得不将 :gen_tcp.listen 函数中的“packet: :line”参数更改为“packet: :raw”。

它在 telnet 上工作,因为 telnet 发送数据行(带有换行符)。

关于使用 Erlang 的 gen_tcp 模块的 Elixir 上的 TCP 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33425452/

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