2010-03-25 46 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的負擔。