我正处于我的Erlang开发中,我需要创建一个C-Node(请参阅link了解C-Node文档)。基本实现很简单,但是文档中存在很大的漏洞。
该代码实现了单线程客户端和服务器。暂时忽略客户端...实现服务器的“c”代码是单线程的,一次只能连接到一个erlang客户端。
现在服务器正在运行并且当前的erlang shell已连接到服务器,请从另一个窗口再次尝试。
请注意,系统似乎已挂起......应该执行命令。它挂起的原因是因为另一个erlang节点已连接,并且没有其他线程正在侦听连接。
注意:连接处理中似乎存在错误。我在接收块中添加了一个超时,但我发现了一些错误的行为,但我没有得到它们。此外,如果我在执行完指示的步骤后强制第一个erlang节点终止,我能够在没有警告或错误的情况下使cserver崩溃。
所以问题是......实现线程化C-Node的最佳方法是什么?什么是合理数量的连接?
答案 0 :(得分:3)
cnode tutorial中的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
系统调用可能会更容易(也许更有效)。
至于最佳连接数,我不认为有这样的规则,如果要在cnode中支持高并发性,则需要对应用程序进行基准测试。但在这种情况下,重新设计系统可能会更好,以便erlang能够应对并发性,从而减轻cnode的负担。