Пример реализации cnode в руководстве по 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 справился с параллелизмом, избавив от этого узел.