是否可以获取传入的Websocket连接的IP地址?

时间:2018-10-23 13:31:10

标签: crystal-lang

我的websocket服务器以这种方式运行:

ws_hdl = WebSocketHandler.new do |ws|

    # here we should determine the IP address of an incoming connection

end

srv = Server.new ws_hdl
srv.listen("0.0.0.0", 8080)

是否可以获取远程主机的IP地址? 出于日志记录和安全原因,也是必需的。

在此先感谢您提供任何好的建议!

2 个答案:

答案 0 :(得分:0)

我不知道您使用的是什么,但是我会使用Kemal来做到这一点:

require "kemal"

ws "/" do |socket, env|
  p env.request
end

Kemal.run

标题如下:

  

HTTP :: Headers {“ Host” =>“ example.com:80”,“ User-Agent” =>   “ curl / 7.49.1”,“接受” =>“ / ”,“连接” =>“升级”,“升级”   =>“ websocket”,“来源” =>“ http://example.com:80”,“ Sec-WebSocket-Key” =>“ SGVsbG8sIHdvcmxkIQ ==”,“ Sec-WebSocket-Version”   =>“ 13”}

然后需要在客户端之前设置Nginx之类的代理,以将IP添加到标头:https://stackoverflow.com/a/27458651/1597964

答案 1 :(得分:0)

抱歉,我无法对此进行正确的测试,但是我认为我有解决方案。

该块具有Web套接字ws,但也可以具有HTTP::Context作为第二个参数。然后,它将包含一个HTTP::Request,其中包含标题。包括类似REMOTE_ADDR的东西。

ws_hdl = WebSocketHandler.new do |ws, context|

  context.request.headers # all headers
  context.request.headers["REMOTE_ADDR"]? # Should be the IP address

end

srv = Server.new ws_hdl
srv.listen("0.0.0.0", 8080)