2015-10-07 70 views
5

Tôi đang cố gắng hoàn tất thiết lập Load Balancer/Máy chủ Đăng nhập/Máy chủ trò chơi bằng Redis cho một số phần. Cân bằng tải là một trong số đó. Trong trường hợp cân bằng tải Redis của tôi, tôi đang sử dụng các tập hợp đặt hàng. Chìa khóa là tên ứng dụng, các thành viên là địa chỉ IP của các máy chủ trò chơi.Erlang: Tìm Địa chỉ IP của tôi

Đây là vấn đề của tôi. Tôi muốn sử dụng một phương pháp công khai trong erlang. Tôi không thể tìm thấy bất cứ điều gì phù hợp với nhu cầu của tôi. Tôi tự hỏi nếu tôi đang tìm kiếm một cái gì đó.

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

Cung cấp cho tôi những gì tôi đang tìm kiếm. Tôi tin rằng hiện tại nó là {192,168,0,14}. Nhưng chức năng không phải là "công khai".

{ok, Socket} = gen_tcp:listen(?PORT_LISTEN_GAME, [{active,once}, {reuseaddr, true}]), 
{ok, {IP, _} = inet:sockname(Socket), 

Cung cấp cho tôi {0,0,0,0}. Tôi đã thử inet:getaddr("owl") cho tôi {127,0,1,1}.

Tôi có bị giới hạn gửi thư qua TCP và sử dụng inet:peername(Socket) không? Có vẻ như rất nhiều thứ để trở nên đơn giản. Tất cả các phần khác nhau của ứng dụng của tôi đang chạy trên cùng một máy tính để thử nghiệm. Nó sẽ trả lại cho tôi {127,0,0,1}? Điều đó sẽ không hiệu quả. Tôi cần gửi lại IP cho người dùng (điện thoại di động của tôi) để họ có thể liên kết với máy chủ phù hợp. Loopback sẽ không làm ....

Mã hiện tại

Tôi muốn cảm ơn tất cả các câu trả lời. Vâng, tôi nhận thấy lời bình luận của Lol4t0 ngay sau năm mới. Vì vậy, tôi đã thay đổi mã của mình để phản ánh điều đó. Đăng bài này cho những người chậm như tôi. Tôi phải nới lỏng bộ não của mình một chút để có được những thứ này.

hd([Addr || {_, Opts} <- Addrs, 
    {addr, Addr} <- Opts, 
    {flags, Flags} <- Opts, 
    lists:member(loopback,Flags) =/= true]). 

Trả lời

4

Chúng tôi đã sử dụng thành công chức năng này để có được những địa chỉ IPv4 không địa phương đầu tiên :

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

Tất nhiên cũng có thể thay đổi để trả về IPv6 nếu đó là những gì bạn muốn.

+0

Tôi đã xem xét các nhà tiên phong nhưng điều này được nhiều người ưa thích. Tôi không quá quen thuộc với việc xây dựng danh sách theo cách này. Cảm ơn bạn. Tôi sửa đổi nó một chút. Có lẽ bạn có thể thích điều này tốt hơn. :) Điều đang xảy ra với tôi là nó đang nắm lấy vòng lặp tiếp theo (ipv6) ... mặc dù nếu tôi sử dụng giới hạn kích thước của bạn thì điều đó sẽ không xảy ra. –

+0

hd ([Addr || {IF, Opts} <- Addrs, {addr, Addr} <- Opts, IF =/= "lo"]). –

+0

@NolanRobidoux Điều đó có thể cung cấp cho bạn cả IPv4 và IPv6 một cách ngẫu nhiên và nó không tính đến các giao diện với các tên như 'lo0', v.v. –

1

Trước tiên, bạn cần hiểu rằng máy chủ của bạn có thể có nhiều hơn một địa chỉ IP duy nhất. Trong thực tế, tất cả {0,0,0,0}, {127,0,0,1} (hey! Trên thực tế tất cả 127.0.0.0/8 là địa chỉ của bạn) và {192,168,0,14} là tất cả địa chỉ IP hợp lệ của bạn. Ngoài ra nếu máy chủ lưu trữ của bạn sẽ có một số giao diện khác được kết nối, bạn sẽ nhận được nhiều địa chỉ IP hơn. Vì vậy, về cơ bản, bạn không thể tìm thấy chức năng sẽ nhận được địa chỉ IP mà bạn cần.

Thay vào đó là một tài liệu tốt function trong inet module sẽ liệt kê các giao diện mỗi địa chỉ IP riêng của mình:

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

Cảm ơn. Nên đã tiếp tục đi xuống danh sách trên manlac trang trực tuyến. Tôi biết mỗi giao diện có một IP :) Tôi chỉ cần một hợp lệ để sử dụng đó là duy nhất (nghĩa là không phải bất kỳ loopback) để điện thoại của tôi có thể nói chuyện với nó và các trường hợp máy chủ trò chơi có thể được tỷ lệ giới hạn đúng. Điều này phù hợp với hóa đơn. –

Các vấn đề liên quan