2010-03-25 48 views
3

我在Erlang开发中的一个地方,我需要创建一个C节点(请参阅针对C-Node文档的link)。基本的实现很简单,但是,文档中有一个巨大的漏洞。Threaded Erlang C-Node(cnode)互操作性howto?

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

  1. 启动EPMD( 'EPMD -daemons')
  2. 启动所述服务器应用( 'cserver 1234')
  3. 启动Erlang的客户端应用程序( 'ERL -sname E1 -setcookie secretcookie')[在一个在#从二郎壳现在3

服务器正在运行,并且电流的erlang壳具有:不同的窗口从#2]

  • 执行服务器命令(“富(3)complex3。”)连接到服务器从另一个窗口再次尝试。

    1. 打开一个新窗口。
    2. 启动erlang客户端('erl -sname e2 -setcookie secretcookie')。
    3. 执行新的服务器命令('complex3:foo(3)。')。

    请注意,系统似乎挂起...当它应该执行命令。它挂起的原因是因为其他erlang节点已连接,并且没有其他线程正在侦听连接。

    注意:似乎有连接处理中的错误。我在接收模块中添加了一个超时,并且发现了一些错误的行为,但是我没有完全理解。另外,如果我强制第一个erlang节点在指定的步骤执行后终止,我能够使cserver在没有警告或错误的情况下崩溃。

    所以,这个问题......什么是实现线程化C-Node的最佳方式?什么是合理的连接数量?

  • +0

    为了确定崩溃的性质,我使用gdb运行代码,显示服务器正在接收SIGPIPE。我用'信号(SIGPIPE,SIG_IGN)'来对抗这个信号。 – Richard 2010-03-29 11:58:53

    +0

    如果这是您的问题的答案,请将其写入答案并“接受”该答案,以便将此问题列入“已答复”列表中。 – ndim 2010-04-21 13:51:12

    回答

    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将指向一个封闭的套接字。

    如果您想接受多个入站连接,则必须循环接受连接并实现处理多个文件描述符的方法。如果您的操作系统支持它们,则无需多线程程序即可使用pollselect系统调用,这可能会更容易(也可能更有效)。

    至于连接的最佳数量,我不认为有这样的规则,如果你想支持cnode的高并发性,你需要基准你的应用程序。但是在这种情况下,重新设计系统可能会更好,这样erlang就可以应对并发性,从而减轻cnode的负担。