2015-10-07 17 views
5

Redisを使用してロードバランサ/ログインサーバー/ゲームサーバーの設定を完了しようとしています。ロードバランシングもその1つです。私のRedisロードバランシングインスタンスでは、私は順序付きセットを使用しています。キーはアプリケーション名であり、メンバーはゲームサーバーのIPアドレスです。Erlang:自分のIPアドレスを見つける

ここに私の問題があります。私はerlang内でpublicメソッドを使いたいと思います。私のニーズに合ったものは何も見つかりません。私は何かを探しているのかしらと思っています。

{ok, L} = inet:getif(), 
IP = element(1, hd(L)), 

私が探しているものを提供します。私は現在それが{192,168,0,14}と信じています。しかし、この機能は「公開」ではありません。

私に{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]). 

答えて

4

local_ip_v4() -> 
    {ok, Addrs} = inet:getifaddrs(), 
    hd([ 
     Addr || {_, Opts} <- Addrs, {addr, Addr} <- Opts, 
     size(Addr) == 4, Addr =/= {127,0,0,1} 
    ]). 

もちろん、必要であればIPv6を返すように変更することもできます。

+0

私はプロプリストを探していましたが、これがはるかに望ましいです。私はこのようにリストを構築することにあまり慣れていない。ありがとうございました。私は少し修正しました。おそらくあなたはこれがより好きかもしれません。 :) 私に起こったことは、次の(ipv6)ループバックを取得していたということでした...私があなたのサイズ制約を使用した場合、それは起こらなかったでしょう。 –

+0

hd([Addr || {IF、Opts} < - Addrs、{addr、Addr} < - オプション、IF =/= "lo"])。 –

+0

@NolanRobidouxこれはあなたにIPv4とIPv6の両方を無作為に与えることができ、 'lo0'のような名前のインタフェースを考慮に入れません。 –

1

まず、ホストに複数の一意のIPアドレスがあることを理解する必要があります。実際にすべて{0,0,0,0}{127,0,0,1}(ちょっと!実際には127.0.0.0/8はあなたのアドレスです)と{192,168,0,14}はすべてあなたの有効なIPアドレスです。さらに、ホストにいくつかの他のインターフェイスが接続されている場合は、より多くのIPアドレスを取得できます。したがって、基本的にはのIPアドレスがになる関数を見つけることはできません。

代わりに、それは独自のIPアドレスとのインタフェースそれぞれの一覧が表示されますinetモジュールで十分に文書functionです:我々が正常に最初の非ローカルIPv4アドレスを取得するには、この機能を使用してきた

getifaddrs() -> {ok, Iflist} | {error, posix()} 

Types: 

Iflist = [{Ifname, [Ifopt]}] 
Ifname = string() 
Ifopt = {flag, [Flag]} 
     | {addr, Addr} 
     | {netmask, Netmask} 
     | {broadaddr, Broadaddr} 
     | {dstaddr, Dstaddr} 
     | {hwaddr, Hwaddr} 
Flag = up 
    | broadcast 
    | loopback 
    | pointtopoint 
    | running 
    | multicast 
Addr = Netmask = Broadaddr = Dstaddr = ip_address() 
Hwaddr = [byte()] 
+0

ありがとうございました。オンラインのerlangのマンページのリストを崩してはならない。私は各インターフェイスがIPを持っていることを知っています:私はちょうど私はそれに話すことができ、ゲームサーバーのインスタンスは、速度が適切に制限されることができるように(すなわち、ループバックではない)ユニークなものを使用する有効なものが必要です。これは法案に適合します。 –

関連する問題