2010-11-16 2 views
2

У меня вопрос о проекте, который я должен реализовать для своего курса с распределенной системой.erlang общий вопрос о сокете

Проект состоит из проектирования и реализации библиотеки, которая обеспечивает надежную многоадресную услугу для пользовательских процессов. Все процессы относятся к группе, и сообщение отправляется процессом-членом всем членам группы. Отправитель исключается из списка получателей.

Это кажется мне довольно легко реализовать в Эрл, в связи с его передачей сообщений структуры ... больше очков дается, если вы используете RPC вызов вместо обычных сокетов реализации на основе ..

Теперь мой вопрос заключается в следующем : одна из обязательных точек этих проектов требует, чтобы сокеты не были открыты, когда между процессами не было обмена ...

Наш курс проводится на C, но мы можем использовать любой язык, который нам нравится ... могу ли я удовлетворить это ограничение, используя erlang-узлы и вызовы rpc?

заблаговременно

+1

Да, вы можете удовлетворить это ограничение. –

ответ

2

Да. Модуль rpc имеет multicall, который принимает список узлов и будет выполнять именно то, что вы описали. Он не будет держать ваши сокеты открытыми, когда он их не использует.

2

Несмотря на то, что другие ответы говорят, поведение по умолчанию Erlang не удовлетворяет вашим ограничениям.

Типичная сеть узлов Erlang, использующих распределение Erlang, будет оставаться плотно подключенной (каждый узел, подключенный к каждому другому узлу) с открытыми сокетами TCP, даже если вы их не используете. Вам либо придется использовать -connect_all false, либо управлять открытием/закрытием соединений с другими узлами самостоятельно, или вам придется разрабатывать собственный протокол распространения. Я бы рекомендовал последнее, тем более, что вы учитесь. Трюк, чтобы облегчить это использование term_to_binary и binary_to_term.

+0

Afaik '-Connect_all false' просто предотвращает подключение узла ко всем узлам при подключении к сети. Когда-то открытое соединение по-прежнему остается открытым навсегда. – ZeissS

+0

Конечно, выполнение -connect_all false не решает проблему самостоятельно. Вы также должны использовать net_kernel: connect_node/1 и erlang: disconnect_node/1 стратегически. Это то, что я подразумевал под «управлением открытием/закрытием соединений с другими узлами». –

Смежные вопросы