在线文档教程

erl_connect

erl_connect

C库

erl_connect

库摘要

与分布式Erlang通信。

描述

该模块以对Erlang进程透明的方式,为分布式Erlang节点和C节点之间的通信提供支持。

一个C节点对Erlang来说是一个隐藏节点。 也就是说,知道C节点名称的Erlang进程可以以正常方式与它进行通信,但节点名称不会出现在ERTS中由erlang:nodes / 0提供的列表中。

输出

int erl_accept(listensock, conp)

类型

服务器进程使用此函数来接受来自客户端进程的连接。

  • listensock是打开的套接字描述符,其中listen()已经被称为。

  • conp是指向ErlConnect结构,描述如下:

typedef struct { char ipadr[4]; char nodename[MAXNODELEN]; } ErlConnect;

成功时,conp将填入连接客户端的地址和节点名称,并返回文件描述符。 如果失败,则返回ERL_ERROR,并将erl_errno设置为EIO。

int erl_close_connection(fd)

类型

关闭与Erlang节点的打开连接。

Fd是从erl_connect()erl_xconnect()...

成功时返回 0。 如果调用失败,则返回非零值,并且可以通过适当的平台相关调用获取错误原因。

int erl_connect(node)int erl_xconnect(addr, alive)

类型

设置到Erlang节点的连接。

erl_xconnect()要求指定远程主机的IP地址和远程节点的别名。erl_connect()提供另一个接口,并根据提供的节点名称确定信息。

  • addr远程主机的32位IP地址。

  • alive远程节点的别名。

  • node远程节点的名称。

在成功时返回打开的文件描述符,否则返回负值。在后一种情况下erl_errno被设置为下列之一:

EHOSTUNREACH远程主机node是遥不可及的。ENOMEM没有更多的内存可用。EIOI/O错误

此外,来自套接字(2)和连接(2)系统调用的errno值可以传播到erl_errno中。

例子:

#define NODE "madonna@chivas.du.etx.ericsson.se" #define ALIVE "madonna" #define IP_ADDR "150.236.14.75" /*** Variant 1 ***/ erl_connect( NODE /*** Variant 2 ***/ struct in_addr addr; addr = inet_addr(IP_ADDR erl_xconnect( &addr , ALIVE

int erl_connect_init(number, cookie, creation)int erl_connect_xinit(host, alive, node, addr, cookie, creation)

类型

初始化erl_connect模块。特别是,这些函数用于标识调用它们的C节点的名称。类中的任何其他函数之前都必须调用这些函数之一。erl_connect使用模块。

erl_connect_xinit()供以后使用的商店使用以下信息:

  • 节点的主机名,host

  • Alivename,alive

  • 节点名,node

  • IP地址,addr

  • Cookie,cookie

  • 创作编号,creation

erl_connect_init()提供了一个替代接口,它不需要调用者那么多的信息。 相反,erl_connect_init()使用gethostbyname()来获取默认值。

如果你使用erl_connect_init(),你的节点将有一个简短的名字,也就是说,它不会被完全限定。 如果您需要使用完全限定(长)名称,请改用erl_connect_xinit()。

  • host正在运行节点的主机的名称。

  • alive节点的别名。

  • node是节点名。它应该是形式上的alivename@hostname...

  • addr的32位ip地址。host...

  • cookie是访问远程节点所需的授权字符串。 如果为NULL,则在用户HOME目录中搜索cookie文件.erlang.cookie。 主目录的路径从Unix上的环境变量HOME和Windows上的HOMEDRIVE和HOMEPATH变量中检索。 有关更多详细信息,请参阅内核中的验证模块。

  • creation有助于识别C节点的特定实例。特别是,它可以帮助防止我们接收发送到具有相同注册名称的较早进程的消息。

充当服务器的C节点在调用时被分配一个创建号码erl_publish()

erl_connect_init()使用数字来构造实际的节点名称。 在下面的示例2中,“c17@a.DNS.name”是生成的节点名称。

例1:

struct in_addr addr; addr = inet_addr("150.236.14.75" if (!erl_connect_xinit("chivas", "madonna", "madonna@chivas.du.etx.ericsson.se", &addr; "samplecookiestring..."), 0) erl_err_quit("<ERROR> when initializing !"

例2:

if (!erl_connect_init(17, "samplecookiestring...", 0)) erl_err_quit("<ERROR> when initializing !"

int erl_publish(port)

类型

服务器进程使用此函数向本地名称服务器EPMD注册,从而允许其他进程使用注册名称发送消息。 在调用该函数之前,该进程应该在打开的套接字上调用bind()和listen()。

port要注册的本地名称,并且与先前绑定到套接字的端口号相同。

若要向EPMD取消注册,只需关闭返回的描述符即可。

成功后,将返回一个连接调用进程到EPMD的描述符。一旦失败,-1会被退回并且erl_errno设置为:

EIOI/O错误

此外,errno来自socket(2)connect(2)系统调用的值可以传播到erl_errno

int erl_receive(fd, bufp, bufsize)

类型

接收由Erlang外部格式的字节序列组成的消息。

  • fd是Erlang连接的打开描述符。

  • bufp是一个足够大的缓冲区,足以容纳所需的消息。

  • bufsize表示bufp...

如果tick发生,即连接另一端的Erlang节点已轮询此节点以查看它是否仍然活着,函数返回ERL_TICK并且没有消息被放置在缓冲区中。还有,erl_errno设置为EAGAIN...

成功后,消息将放置在指定的缓冲区中,该函数返回实际读取的字节数。失败时,函数返回一个负值并设置erl_errno致下列之一:

EAGAIN临时错误:重试。EMSGSIZE缓冲区太小了。EIOI/O错误

int erl_receive_msg(fd, bufp, bufsize, emsg)

类型

将消息接收到指定的缓冲区并将其解码为(ErlMessage *) emsg...

  • fd是Erlang连接的打开描述符。

  • bufp是一个足够大的缓冲区,足以容纳所需的消息。

  • bufsize表示bufp...

  • emsg是指向ErlMessage结构,其中将消息解码为。ErlMessage定义如下:

typedef struct { int type; ETERM *msg; ETERM *to; ETERM *from; char to_name[MAXREGLEN]; } ErlMessage;

自早期版本的Erl_Interface以来,ErlMessage的定义已经发生了变化。

type标识消息的类型,如下所示:

ERL_SEND

发生了普通的发送操作,并且emsg->包含收件人的pid。 该消息在emsg-> msg中。

ERL_REG_SEND

已注册的发送操作已经发生,并且emsg->from包含发件人的PID。信息在emsg->msg中。

ERL_LINKERL_UNLINK

emsg->to和emsg->from包含链接或取消链接的发件人和收件人的PIDS。emsg->msg不被使用。

ERL_EXIT

一个环节中断。emsg->to和emsg->from包含链接进程的PIDS,以及emsg->msg包含退出的原因。

这是调用者的责任来释放内存指向emsg->msg,emsg->to和emsg->from。

如果tick发生,即连接另一端的Erlang节点已轮询此节点以查看它是否仍然活着,函数返回ERL_TICK指示已收到并响应了滴答,但缓冲区中没有放置任何消息。在这种情况下,你要再次调用erl_receive_msg()

成功时,函数返回ERL_MSG,Emsg结构如上所述初始化,或者ERL_TICK,在这种情况下不返回消息。 失败时,函数返回ERL_ERROR并将erl_errno设置为以下之一:

EMSGSIZE缓冲区太小了。ENOMEM没有更多的内存可用。EIOI/O错误

int erl_reg_send(fd, to, msg)

类型

将Erlang术语发送到注册过程。

  • fd是Erlang连接的打开描述符。

  • to包含邮件预定收件人的注册名称的字符串。

  • msg是要发送的Erlang术语。

成功时返回1,否则返回0.在后一种情况下,erl_errno被设置为以下之一:

ENOMEM没有更多的内存可用。EIOI/O错误

ETERM *erl_rpc(fd, mod, fun, args)int erl_rpc_from(fd, timeout, emsg)int erl_rpc_to(fd, mod, fun, args)

类型

支持在远程节点上调用Erlang函数。 erl_rpc_to()向远程节点发送RPC请求,erl_rpc_from()接收此类调用的结果。 erl_rpc()通过发送RPC请求并等待结果来结合这两个函数的功能。 另请参阅内核中的rpc:call / 4。

  • fd是Erlang连接的打开描述符。

  • timeout是等待结果的最长时间(以毫秒为单位)。要永远等待,请指定ERL_NO_TIMEOUT。当erl_rpc()调用erl_rpc_from(),调用将永远不会超时。

  • mod包含要在远程节点上运行的函数的模块的名称。

  • fun要运行的函数的名称。

  • args是一个Erlang列表,包含要传递给函数的参数。

  • emsg包含函数调用结果的消息。

RPC服务器返回的实际消息是一个2元组{rex,Reply}。 如果您在代码中使用erl_rpc_from(),则这是您需要解析的消息。 如果使用erl_rpc(),则会为您解析元组本身,并且返回到程序的消息是包含仅回复的Erlang项。 对RPC请求的回复始终是ERL_SEND消息。

这是调用者负责释放返回的ETERM结构和存储指向emsg->msg和emsg->to。

erl_rpc()返回成功时远程函数的返回值,否则返回NULL

erl_rpc_to()在成功时返回0,否则返回负数。

erl_rcp_from()成功返回ERL_MSG(Emsg现在包含回复元组),否则返回ERL_TICK,ERL_TIMEOUT或ERL_ERROR之一。

如果失败,所有三个功能都将设置erl_errno为以下之一:

ENOMEM没有更多的内存可用。EIOI / O错误。ETIMEDOUT超时已过期。EAGAIN临时错误:请重试。

int erl_send(fd, to, msg)

类型

向进程发送一个Erlang术语。

  • fd是Erlang连接的打开描述符。

  • to是一个Erlang术语,它包含消息的预定收件人的PID。

  • msg是要发送的Erlang术语。

成功时返回1,否则返回0.在后一种情况下,erl_errno被设置为以下之一:

EINVAL无效参数:to不是有效的Erlang pid。 ENOMEM没有更多的内存可用。 EIO I / O错误。

const char *erl_thisalivename()const char *erl_thiscookie()short erl_thiscreation()const char *erl_thishostname()const char *erl_thisnodename()

检索有关C节点的信息。这些值最初使用erl_connect_init()或设置erl_connect_xinit()

int erl_unpublish(alive)

类型

此函数可以由进程调用,以便在本地主机上从EPMD注销指定的节点。但是,这通常是不允许的,除非EPMD是用标志启动的。-relaxed_command_check通常情况下并非如此。

要取消注册已发布的节点,应该关闭由ei_publish()返回的描述符。

警告

此函数已被取消,并将在以后的版本中删除。

alive要取消注册的节点的名称,即节点名称的第一个组件,但没有@hostname...

如果该节点已成功从EPMD注销,0则被返回,否则-1被返回且erl_errno设置为EIO

int erl_xreceive_msg(fd, bufpp, bufsizep, emsg)

类型

类似于erl_receive_msg.区别是erl_xreceive_msg预期缓冲区将被分配给malloc,如果接收到的消息不适合原始缓冲区,则重新分配它。因此,缓冲区和缓冲区长度都作为指针给出;它们的值可以通过调用改变。

成功后,该函数将返回ERL_MSGEmsg如上文所述,结构被初始化,或ERL_TICK,在这种情况下,不返回任何消息。失败时,函数返回ERL_ERROR和集erl_errno致下列之一:

EMSGSIZE缓冲区太小了。ENOMEM没有更多的内存可用。EIOI/O错误

struct hostent *erl_gethostbyaddr(addr, length, type)struct hostent *erl_gethostbyaddr_r(addr, length, type, hostp, buffer, buflen, h_errnop)struct hostent *erl_gethostbyname(name)struct hostent *erl_gethostbyname_r(name, hostp, buffer, buflen, h_errnop)

类型

一些常见的名称查找函数的方便函数。

调试信息

如果连接尝试失败,可以检查以下内容:

  • erl_errno

  • 正确的cookie被使用

  • EPMD正在运行

  • 另一边的远程erlang节点正在运行与erl_interface