Unfortunately there are quite a number of things wrong. =(<div><br></div><div>You should read this: <a href="http://www.erlang.org/doc/getting_started/conc_prog.html">http://www.erlang.org/doc/getting_started/conc_prog.html</a></div>
<div>I would suggest going through the tutorial on 
<a href="http://learnyousomeerlang.com/">http://learnyousomeerlang.com</a> .  It's quite good.</div><div><br></div><div>Here's why your code crashed...</div><div><br></div><div><i>(user@ubuntuPC)27> {servidor,server@ubuntuPC} !</i></div>
<div><i>servidor:call(login,irene,6666).<br>** exception error: undefined function servidor:call/3<br></i><br></div><div>You told it to call servidor:call/3, but that does not exist.  You should be using gen_server:call/2 (see below). If it did, it would make the call and try to send the return code to 
<i>{servidor,server@ubuntuPC}</i> <i>.</i></div><div><i><br></i></div><div><i>(user@ubuntuPC)28> {servidor,server@ubuntuPC} ! servidor:login(irene,6666).<br>** exception exit: {noproc,{gen_server,call,[servidor,{login,irene,6666}]}}<br>
    in function  gen_server:call/2<br></i><br></div><div>You now called servidor:login/2 locally, which worked but tried to gen_server:call back to itself (via ?MODULE) to do a login.  However, servidor is not running on 
<i>(user@ubuntuPC)</i> ... it's running on <i>{servidor,server@ubuntuPC}</i></div><div><br></div><div><i>(user@ubuntuPC)29> {servidor,server@ubuntuPC} !<br>process_request(login,{irene,2321}).<br>** exception error: undefined shell command process_request/2<br>
</i><br></div><div>You ran this from the shell and it doesn't know about process_request/2.  If it did, the return-value from process_request would be shipped to <i> {servidor,server@ubuntuPC}</i></div><div><br></div>
<div>Don't mix ! and call/cast.    The receive handlers are slightly different for OTP stuff ({'$gen_cast',Msg,State} and {'$gen_call',From,Msg,State}) which you have to account for.</div><div>If you're using OTP, use OTP calls and handlers.  It's cleaner.</div>
<div><br></div><div>Try gen_server:call( {servidor,server@ubuntuPC}, {login, irene,777} ).</div><div><div><br></div><div>Make sure server can login from server  ( such as gen_server:call(self(), {login, irene, 777} ... and then scale out to multiple nodes.)</div>
<div><br></div><div>-mox</div><div><br><br><div class="gmail_quote">On Wed, Apr 11, 2012 at 4:03 PM, megalomania <span dir="ltr"><<a href="mailto:ricardocb48@gmail.com">ricardocb48@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
*Hi all,<br>
Im newbie on Erlang and trying lear to use gen_server but i begin to<br>
understan that maybe im wrong.<br>
<br>
Im just trying to making a chat_server with gen_serve, so the idea is a<br>
client on an another node could try to login in the chat_server who will be<br>
in another node.<br>
<br>
here is my code:<br>
*<br>
<br>
-module(servidor) .<br>
-behavior(gen_server) .<br>
<br>
% API functions<br>
-export([start_link/0, hi/0, login/2, logout/1, times/2, stop/0]).<br>
<br>
% Callback functions<br>
-export([init/1, handle_call/3, handle_info/2, terminate/2, handle_cast/2,<br>
code_change/3]).<br>
<br>
-define(NAME_SERVER, ?MODULE).<br>
-define(LOGUEADOS, logeados).<br>
<br>
<br>
start_link() -><br>
        gen_server:start_link({local, ?NAME_SERVER}, ?MODULE, [], []).%Se registra<br>
el proceso con el nombre del modulo(servidor)<br>
<br>
hi() -><br>
        gen_server:cast(?MODULE, hi) .<br>
<br>
stop() -><br>
        gen_server:cast(?MODULE, stop).<br>
<br>
login(Nick,Pid) -><br>
        gen_server:call(?MODULE, {login, Nick, Pid}).<br>
<br>
logout(Nick) -><br>
        gen_server:call(?MODULE, {logout, Nick}).<br>
<br>
times(N, M) -><br>
        ?MODULE ! {times_request, self(), {N, M}}.<br>
<br>
<br>
<br>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br>
%% Callback functions implementation %%<br>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br>
<br>
init([]) -><br>
        {ok, ets:new(?LOGUEADOS, [set])}.<br>
<br>
terminate(_Reason, _State) -><br>
        {_, Tab} = _State,<br>
        ets:delete(Tab),<br>
        ok.<br>
<br>
<br>
handle_call({login, Nick, Pid}, _From, _State) -><br>
        %% En el login habra que crear una nodo del que haga el login // Para<br>
probarlo, miro simplemente si existe en la BD.<br>
        io:format("Loggin.. y state=~w: ~n", [_State]),<br>
        BOOL = ets:member(_State, Nick),<br>
        io:format("The user is online? = ~w ~n", [BOOL]),<br>
        if<br>
                BOOL == true -> io:format("~w its already login", [Nick]);<br>
                true -> ets:insert(_State, {Nick,Pid}), io:format("Login succesful ~n")<br>
        end,<br>
        {reply, {login, Nick}, _State};<br>
<br>
<br>
handle_call({logout, Nick}, _From, _State) -><br>
        io:format("Logout...~n", []),<br>
        ets:delete(_State, Nick).<br>
<br>
<br>
handle_cast(hi, State) -><br>
        io:fwrite("\t\tHi!\~n"),<br>
        {noreply, State} ;<br>
<br>
handle_cast(stop, _State) -><br>
        io:format("Stopped~n", []),<br>
        {_, Tab} = _State,<br>
        ets:delete(Tab),<br>
        {stop, normal, _State} .<br>
<br>
<br>
handle_info({times_request, Pid, {N, M}}, State) -><br>
        io:fwrite("\t~w server handling info, request number ~w~n", [?MODULE,<br>
State]),<br>
        Pid ! {times_response, N*M},<br>
        {noreply, State} .<br>
<br>
code_change(_OldVsn, _State, _Extra) -><br>
        {ok, _State}.<br>
<br>
<br>
*and then i typed this in one console:*<br>
<br>
>erl -sname server<br>
(server@ubuntuPC)1> c(servidor).<br>
{ok,servidor}<br>
(server@ubuntuPC)2> servidor:start_link().<br>
{ok,<0.45.0>}<br>
(server@ubuntuPC)3><br>
<br>
<br>
*and then i typed this in another console:*<br>
user@ubuntuPC)25> {servidor,server@ubuntuPC} ! {servidor,login,irene,777}.<br>
{servidor,login,irene,777}<br>
(user@ubuntuPC)26> {servidor,server@ubuntuPC} ! {servidor,login,irene,777}.<br>
{servidor,login,irene,777}<br>
(user@ubuntuPC)27> {servidor,server@ubuntuPC} !<br>
servidor:call(login,irene,6666).<br>
** exception error: undefined function servidor:call/3<br>
(user@ubuntuPC)28> {servidor,server@ubuntuPC} ! servidor:login(irene,6666).<br>
** exception exit: {noproc,{gen_server,call,[servidor,{login,irene,6666}]}}<br>
     in function  gen_server:call/2<br>
(user@ubuntuPC)29> {servidor,server@ubuntuPC} !<br>
process_request(login,{irene,2321}).<br>
** exception error: undefined shell command process_request/2<br>
(user@ubuntuPC)30> {servidor,server@ubuntuPC} ! {hi}.<br>
{hi}<br>
(user@ubuntuPC)31> {servidor,server@ubuntuPC} ! {async,hi}.<br>
<br>
<br>
*almost or the most of instructions makes server_node crash :(*<br>
<br>
My question is, what im doing wrong? It is the correct way?<br>
<br>
<br>
--<br>
View this message in context: <a href="http://erlang.2086793.n4.nabble.com/Help-with-gen-server-and-a-chat-server-tp4550462p4550462.html" target="_blank">http://erlang.2086793.n4.nabble.com/Help-with-gen-server-and-a-chat-server-tp4550462p4550462.html</a><br>

Sent from the Erlang Questions mailing list archive at Nabble.com.<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div><br></div></div>