我正在尝试使用Redis为某些部分完成Load Balancer /登录服务器/游戏服务器设置.负载平衡就是其中之一.在我的Redis负载平衡实例中,我正在使用有序集.关键是应用程序名称,成员是游戏服务器的IP地址.
这就是我的问题.我想在erlang中使用一个公共方法.我找不到符合我需求的东西.我想知道我是不是在寻找一些东西.
{ok, L} = inet:getif(),
IP = element(1, hd(L)),
Run Code Online (Sandbox Code Playgroud)
给我我正在寻找的东西.我相信目前是{192,168,0,14}.但功能不是"公开的".
{ok, Socket} = gen_tcp:listen(?PORT_LISTEN_GAME, [{active,once}, {reuseaddr, true}]),
{ok, {IP, _} = inet:sockname(Socket),
Run Code Online (Sandbox Code Playgroud)
给了我{0,0,0,0}.我试过inet:getaddr("owl")这个给了我{127,0,1,1}.
我是否仅限于通过TCP发送消息并使用inet:peername(Socket)?看起来很像是为了让事情变得如此简单.我的应用程序的所有不同部分都在同一台计算机上运行以进行测试.是否会让我回到{127,0,0,1}?那不行.我需要将IP发送回用户(我的手机),以便他们可以与正确的服务器连接.环回不会......
现行守则
我要感谢所有的回复.是的,我注意到Lol4t0在新年之后的评论.所以我改变了我的代码来反映这一点.为像我这样的慢人发布这个.我必须让我的大脑陷入困境才能让这些东西被点击.
hd([Addr || {_, Opts} <- Addrs,
{addr, Addr} <- Opts,
{flags, Flags} <- Opts,
lists:member(loopback,Flags) =/= true]).
Run Code Online (Sandbox Code Playgroud)
我们已成功使用此函数获取第一个非本地IPv4地址:
local_ip_v4() ->
{ok, Addrs} = inet:getifaddrs(),
hd([
Addr || {_, Opts} <- Addrs, {addr, Addr} <- Opts,
size(Addr) == 4, Addr =/= {127,0,0,1}
]).
Run Code Online (Sandbox Code Playgroud)
它当然可以更改为返回IPv6,如果这是你想要的.