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]).
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. –
hd ([Addr || {IF, Opts} <- Addrs, {addr, Addr} <- Opts, IF =/= "lo"]). –
@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. –