我使用以下代码在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 deveice(我正在编写这段代码)中获取数据时,出现错误:
{:error, reason} = :gen_tcp.recv(socket, 0)
它显示的原因只是"关闭"。
然而,设备正在发送数据,我使用tcp数据包嗅探器(tcpflow)确认。
此外,当我尝试使用上面的教程中描述的telnet发送数据时,它可以正常工作。
任何帮助都将受到高度赞赏。
答案 0 :(得分:6)
我终于弄清楚了。实际上,该设备正在发送原始数据流而不是数据行。所以我不得不改变" packet :: line"参数in:gen_tcp.listen function to" packet :: raw"。
它正在telnet上工作,因为telnet发送数据行(带换行符)。