2

我有一个正在工作的 telnet 服务器,我正在尝试为其创建一个单元测试。服务器可以与 telnet 客户端一起正常工作,并且应在建立连接后立即发送提示。在同一个套接字上发送工作正常。但是,来自单元测试的 TCP 客户端拒绝接收数据并超时。我是 Elixir 的新手,所以,我可能缺少一些基本的东西。

opts = [:binary, packet: :line, active: false, reuseaddr: true]
{:ok, socket} = :gen_tcp.connect('127.0.0.1', 4040, opts)
{:ok, date_string} = Date.universal |> DateFormat.format("{ISO}")
IO.puts "Socket #{inspect socket} Created #{date_string}"
case :gen_tcp.recv(socket, 0, 5000) do
    {:ok, data} -> IO.puts "Recevied data is #{data}"
    {:error, reason} -> IO.puts "Error: Test Setup: First Receive: Reason: #{reason}"
end

我得到以下输出

Socket #Port<0.5758> Created 2015-12-12T01:36:08.248+0000
Error: Test Setup: First Receive: Reason: timeout

如果有人可以阐明 Elixir 新手做错了什么,那将有所帮助

4

1 回答 1

2

您的错误可能来自使用该packet: :line选项。您可能知道,此选项使套接字上的数据包不被“考虑”(例如,它们不会作为消息发送 if :activeistrue并且它们不会被:gen_tcp.recv/2-3if :activeis返回false),直到有换行符。

这意味着如果您的 TCP 服务器"foo"向下发送套接字,:gen_tcp.recv则不会返回它,因为它不是“线”。发送"foo/n":gen_tcp.recv取而代之。

检查您的服务器,它正在发送一个以换行符终止的数据包,因为这可能是原因(我看不出您的代码有任何其他问题:))。

于 2015-12-12T10:41:17.013 回答