[erlang-questions] about Erlang C Node monitor

Matt Stancliff <>
Mon Dec 14 09:48:33 CET 2009


Yu-Teh,

On Dec 13, 2009, at 11:36 PM, Yu-Teh Shen wrote:
> But what I should do if I want to *monitor* the C node like all  
> other Erlang
> node and make erlang *connects*, *net_adm:ping* works?

You can use erlang:monitor_node to monitor C nodes.

Handling net_adm:ping in a C node takes a few steps.  Here is what I  
use:

main processing loop:
=====
   ETERM *gen_call         = erl_format("~a", "$gen_call");

   while (loop) {
     got = erl_receive_msg(fd, buf, BUFSIZE, &emsg);
     if (got == ERL_TICK) {
       /* ignore */
     } else if (got == ERL_ERROR) {
       loop = 0;
     }
     else {
       if (emsg.type == ERL_REG_SEND) {
         msg = erl_element(1, emsg.msg);
         if (erl_match(_something_i_want_, msg)) {
           /* blah */
         }
         else if (erl_match(gen_call, msg)) {
           process_gen_call(fd, emsg.from, emsg.msg);
         }
       }
     }
     erl_free_term(msg);
     erl_free_term(emsg.msg);
     erl_free_term(emsg.to);
     erl_free_term(emsg.from);
   }
   erl_free_term(gen_call);
=====

Then, process_gen_call is:
=====
/* gen_call with is_auth is for handling net_adm:ping responses.
    The incoming message looks like:
    {'$gen_call', {<>, #Ref<2394.0.0>},
      {is_auth, }}
    You must respond with the reference (element 2 of tuple 2) and "yes"
*/
static void process_gen_call(int fd, ETERM *from, ETERM *msg) {
   ETERM *is_auth  = erl_format("~a", "is_auth");
   ETERM *args = erl_element(3, msg);
   ETERM *arg1 = erl_element(1, args);
   if (erl_match(is_auth, arg1)) {
     ETERM *fromp = erl_element(2, msg);
     ETERM *resp = erl_format("{~w, yes}", erl_element(2, fromp));
     erl_send(fd, from, resp);
     erl_free_compound(resp);
     erl_free_term(fromp);
   }
   erl_free_term(args);
   erl_free_term(arg1);
   erl_free_term(is_auth);
}
=====


Hope that helps,

-Matt
-- 
Matt Stancliff                    San Jose, CA
AIM: seijimr              iPhone: 678-591-9337
"The best way to predict the future is to invent it." --Alan Kay



More information about the erlang-questions mailing list