线程化Erlang C节点(cnode)互操作性如何?

线程化Erlang C节点(cnode)互操作性如何?,erlang,interop,erl-interface,Erlang,Interop,Erl Interface,在Erlang开发中,我需要创建一个C节点,请参见C节点文档。基本实现非常简单,但是文档中有一个巨大的漏洞 该代码实现了一个单线程客户端和服务器。暂时忽略客户端。。。实现服务器的“c”代码是单线程的,一次只能连接到一个erlang客户端 启动EPMD“EPMD-守护进程” 启动服务器应用程序“cserver 1234” 启动erlang客户端应用程序“erl-sname e1-setcookie secretcookie”[在与2不同的窗口中] 在3中从erlang shell执行服务器命令co

在Erlang开发中,我需要创建一个C节点,请参见C节点文档。基本实现非常简单,但是文档中有一个巨大的漏洞

该代码实现了一个单线程客户端和服务器。暂时忽略客户端。。。实现服务器的“c”代码是单线程的,一次只能连接到一个erlang客户端

启动EPMD“EPMD-守护进程” 启动服务器应用程序“cserver 1234” 启动erlang客户端应用程序“erl-sname e1-setcookie secretcookie”[在与2不同的窗口中] 在3中从erlang shell执行服务器命令complex3:foo3 现在服务器正在运行,并且当前的erlang shell已连接到服务器,请从另一个窗口重试

打开一个新窗口。 启动erlang客户端“erl-sname e2-setcookie secretcookie”。 执行新的服务器命令“complex3:foo3”。 请注意,系统似乎挂起。。。它应该在什么时候执行命令。挂起它的原因是另一个erlang节点已连接,并且没有其他线程侦听连接

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);
注意:连接处理中似乎存在错误。我在接收块中添加了一个超时,捕获了一些错误行为,但并没有全部捕获。此外,如果在执行指定的步骤后强制第一个erlang节点终止,我还能够使cserver在没有警告或错误的情况下崩溃


所以问题是。。。实现线程化C节点的最佳方式是什么?连接的合理数量是多少?

中的cnode实现示例并不打算处理多个连接的节点,因此您遇到的第一个症状是正常的

erl_accept调用是接收传入连接的调用

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);
注意,以这种方式编写,cnode将只接受一个连接,然后将描述符传递给读/写循环。这就是为什么当erlang节点关闭时,cnode以错误结束,因为erl_receive_msg将失败,因为fd将指向一个关闭的套接字

如果要接受多个入站连接,则必须循环接受连接并实现处理多个文件描述符的方法。这样做不需要多线程程序,如果操作系统支持poll或select系统调用,那么使用poll或select系统调用可能会更容易、更高效


至于最佳连接数,我认为没有规则,如果您想在cnode中支持高并发性,就需要对应用程序进行基准测试。但在这种情况下,可能最好重新设计系统,使erlang能够处理并发性,从而减轻cnode的并发性

为了确定崩溃的性质,我使用gdb运行代码,这表明服务器正在接收SIGPIPE。我用“信号管,信号灯”来抵御那个信号。如果这是您问题的答案,请将其放入答案中并接受该答案,以便此问题显示在已回答的列表中。