【问题标题】:TCP Listener on Elixir using Erlang's gen_tcp moduleElixir 上的 TCP 监听器使用 Erlang 的 gen_tcp 模块
【发布时间】:2016-01-30 06:10:13
【问题描述】:

我正在使用以下代码在 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 发送数据时,它工作正常。

任何帮助将不胜感激。

【问题讨论】:

  • 根据有限的描述,我对您的设置感到困惑 - 您已经获得了 TCP 服务器 的代码,但听起来您想访问您的 GPS TCP 上的设备,因此您可能需要一个 TCP 客户端。您的:gen_tcp.recv 电话可能会显示:closed,因为没有客户端连接到您的服务器。请提供有关设置的更多详细信息,希望有人能提供帮助。
  • 嘿,我昨天解决了这个问题。但是我试图改进细节以使问题更明智。实际上,我只需要一个 TCP 服务器,因为设备不断发送数据,而我必须通过我的服务器接收数据。

标签: tcp elixir


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-12-05
    • 2017-12-13
    • 2018-06-01
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多