2013-09-04 3 views
-1

Когда я создаю интересные вещи, у меня возникла проблема. Мне нужно подключить несколько хостов (не так много, например 10) в кольце топологии, используя сокет, конечно.Есть ли хороший способ создания кольцевой топологии с использованием сокета?

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

На самом деле я придумал решение: для каждого хоста сокет, подключенный к его левому соседу, действует как сервер, а сокет, подключенный справа, действует как клиент. Это работает и масштабируемо. Но все равно это не так просто.

Может ли кто-нибудь придумать лучшие решения или просто скажет, что это один из лучших? :) Спасибо за ваше блестящее понимание.

+1

UDP является бесконтактным и, следовательно, может использоваться для более симметричной топологии, чем TCP. – bluedog

+0

Не имеет значения, используете ли вы UDP или TCP. Вам все равно нужно что-то ждать, когда вы будете вводить данные (сервер) и что-то отправить данные (клиент). – BetaRide

+0

Я думаю, что ваш вопрос в общем. Каково использование и, что еще важнее, какие требования вы должны установить для соединений между серверами. Вам нужно какое-то открытие? Вам нужно какое-то самоисцеление, если серверы? Или вы в порядке с жестко запрограммированным списком серверов, распределенных вручную на ваши серверы? – BetaRide

ответ

0

Вы можете расслабиться своим дизайном в одном направлении. В принципе, для каждой из двух соседних пар, плавайте прослушиватель TCP у обоих соседей, а затем пусть они ждут/спят за случайное время. Тот, кто просыпается первым, инициирует соединение (используя connect()). Таким образом, вам не нужно беспокоиться о правильном сверстнике, подключающемся к левому пэру.

+0

Хорошая идея! Я попробую. – qweruiop

0

Самый простой и надежный способ состоит в том, чтобы каждый узел имел клиент и сервер в обоих направлениях. Если соединение отсутствует, он пытается подключиться в обоих направлениях.

Если возникает ситуация, когда между двумя хостами происходит внезапное соединение двух соединений, тогда IP-адрес каждого узла может использоваться для определения того, какое соединение закрыто. Например, хост с большим IP-адресом закрывает соединение с клиентом, в то время как узел с меньшим IP-адресом закрывает соединение с сервером (неважно, как вы определяете значение «меньше» и «большее» для IP, если оно одинаково для обоих), и другое соединение остается в живых.

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