2013-08-01 15 views
0

我是一個erlang新手。我嘗試使用gen_udp來構建服務器以維護在線客戶端的聯機/脫機狀態。所有客戶端將udp數據發送到udp服務器,服務器從所有客戶端接收udp數據,如果服務器在5秒內未收到數據,服務器將該客戶端標記爲離線。如何使用gen_udp構建udp服務器來顯示在線客戶端?

-module(client_states_manager). 
-export([start/0]). 

start() -> 
     spawn(fun() -> server(8080) end). 

server(Port) -> 
     {ok, Socket} = gen_udp:open(Port, [binary, {active, false}]), 
     io:format("server opened socket:~p~n",[Socket]), 
     loop(Socket). 

loop(Socket) -> 
     inet:setopts(Socket, [{active, once}]), 
     receive 
       {udp, Socket, Host, Port, Bin} -> 
         io:format("server received:~p from ~w~n",[Bin, Host]), 
%%% How to detect if Host is in a list variable (lists:member), if Host is not already in OnlineHosts variable, lists:append it to OnlineHosts       
         %gen_udp:send(Socket, Host, Port, Bin), 
         loop(Socket) 
     end. 


displayOnlineHosts(Hosts) -> 
     io:format("There are online hosts ~p~n",[Hosts]). 

這是爲了測試客戶端Ruby腳本:

require "socket" 

sender = UDPSocket.new 
host = ARGV[0] 
port = ARGV[1] || 8080 

puts "Connect to #{host}:#{port}" 

n = 0 
loop do 
    sender.send("message #{n}", 0, host, port) 
    n = n + 1 
end 

誰給我一些靈感開始?非常感謝。

回答

0

您必須將OnlineHosts變量傳遞給您的loop函數並相應地更新其值。可能是這樣的:

server(Port) -> 
     {ok, Socket} = gen_udp:open(Port, [binary, {active, false}]), 
     io:format("server opened socket:~p~n",[Socket]), 
     loop(Socket, []). 

loop(Socket, OnlineHosts) -> 
     inet:setopts(Socket, [{active, once}]), 
     receive 
       {udp, Socket, Host, Port, Bin} -> 
         io:format("server received:~p from ~w~n",[Bin, Host]), 
%%% How to detect if Host is in a list variable (lists:member), if Host is not already in OnlineHosts variable, lists:append it to OnlineHosts 
         case lists:member(Host, OnlineHosts) of 
          true -> 
            loop(Socket, OnlineHosts); 
          false -> 
            %gen_udp:send(Socket, Host, Port, Bin), 
            loop(Socket, [Host | OnlineHosts]) 
         end 
     end.