当前位置: 代码迷 >> 其他开发语言 >> widonws下,ERLANG node 与 C node 的连接建立有关问题
  详细解决方案

widonws下,ERLANG node 与 C node 的连接建立有关问题

热度:5691   发布时间:2013-02-26 00:00:00.0
widonws下,ERLANG node 与 C node 的连接建立问题
在windows下,完全按照"C:\Program Files\erl5.7.2\doc\tutorial\part_frame"的方法建立CNODE server.
C 源码如下
/* cnode_s2.c */

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#include "erl_interface.h"
#include "ei.h"

#define BUFSIZE 1000

int main(int argc, char **argv) {
  struct in_addr addr; /* 32-bit IP number of host */
  int port; /* Listen port number */
  int listen; /* Listen socket */
  int fd; /* fd to Erlang node */
  ErlConnect conn; /* Connection data */

  int loop = 1; /* Loop flag */
  int got; /* Result of receive */
  unsigned char buf[BUFSIZE]; /* Buffer for incoming message */
  ErlMessage emsg; /* Incoming message */

  ETERM *fromp, *tuplep, *fnp, *argp, *resp;
  int res;
  
  port = atoi(argv[1]);

  erl_init(NULL, 0);

  addr.s_addr = inet_addr("134.138.177.89");
  if (erl_connect_xinit("idril", "cnode", "cnode@idril.du.uab.ericsson.se",
  &addr, "secretcookie", 0) == -1)
  erl_err_quit("erl_connect_xinit");

  /* Make a listen socket */
  if ((listen = my_listen(port)) <= 0)
  erl_err_quit("my_listen");

  if (erl_publish(port) == -1)
  erl_err_quit("erl_publish");

  if ((fd = erl_accept(listen, &conn)) == ERL_ERROR) //总出错,不知原因
  erl_err_quit("erl_accept");
  fprintf(stderr, "Connected to %s\n\r", conn.nodename);

  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) {
  fromp = erl_element(2, emsg.msg);
  tuplep = erl_element(3, emsg.msg);
  fnp = erl_element(1, tuplep);
  argp = erl_element(2, tuplep);

  if (strncmp(ERL_ATOM_PTR(fnp), "foo", 3) == 0) {
  res = foo(ERL_INT_VALUE(argp));
  } else if (strncmp(ERL_ATOM_PTR(fnp), "bar", 3) == 0) {
  res = bar(ERL_INT_VALUE(argp));
  }

  resp = erl_format("{cnode, ~i}", res);
  erl_send(fd, fromp, resp);

  erl_free_term(emsg.from); erl_free_term(emsg.msg);
  erl_free_term(fromp); erl_free_term(tuplep);
  erl_free_term(fnp); erl_free_term(argp);
  erl_free_term(resp);
  }
  }
  }
}

  
int my_listen(int port) {
  int listen_fd;
  struct sockaddr_in addr;
  int on = 1;

  if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  return (-1);

  setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

  memset((void*) &addr, 0, (size_t) sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_port = htons(port);
  addr.sin_addr.s_addr = htonl(INADDR_ANY);

  if (bind(listen_fd, (struct sockaddr*) &addr, sizeof(addr)) < 0)
  return (-1);

  listen(listen_fd, 5);
  相关解决方案