【问题标题】:Retrieve client IP in :ranch在 :ranch 中检索客户端 IP
【发布时间】:2018-06-07 08:15:02
【问题描述】:

我正在使用 :ranch 在我的 Phoenix 应用程序中接收 TCP 包。

首先我在服务器中创建了一个监听器:

:ranch.start_listener(tcp_echo, ranch_tcp, [{port, 5555}], echo_protocol, [] )

如何在echo_protocol 中打印客户端 IP?

【问题讨论】:

  • 我没用过ranch,但是你不需要用ranch明确发出accept吗?这通常是我希望看到的模式。接受后,有关客户端的信息应该可用。
  • @DonBranson 在牧场我使用:ranch.accept_ack(ref) 发送了确认包。 ref 是该示例的 tcp_echo 的别名,我无法从那里检索 IP。也许有可能,但我真的不知道要调用哪个函数,并且文档没有清楚地显示它。
  • 猜想:你有没有试过检查:ranch.start_listener返回的PID的进程字典?你需要一个对call inet:peername/1的套接字的引用。

标签: erlang elixir phoenix-framework


【解决方案1】:

牧场包括sample echo application

echo_protocol.erl中,有一个init函数接受来自客户端的连接:

init(Ref, Socket, Transport, _Opts = []) ->
    ok = ranch:accept_ack(Ref),
    loop(Socket, Transport).

你可以在那里显示客户端IP地址:

init(Ref, Socket, Transport, _Opts = []) ->
    ok = ranch:accept_ack(Ref),
    {ok, {IpAddress, _}} = inet:peername(Socket),
    io:format("Client ~p~n", [IpAddress]),
    loop(Socket, Transport).

它将以如下格式显示:

Client {127,0,0,1}

【讨论】:

  • 非常感谢!我会试试的!
猜你喜欢
  • 2011-09-09
  • 2018-08-21
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多