У меня на компьютере работают два процесса:
- Обычная отправка клиентской программы на многоадресную рассылку 224.1.2.3:8000
- Процесс "Маршрутизатор"
Процесс маршрутизатора объединен в две многоадресные группы:
- 224.1.2.3: 8000
- 224.1.2.4: 8001
Идея маршрутизатора проста: когда трафик поступает из любой многоадресной группы, просто перенаправьте его в другую многоадресную группу. Чтобы сделать это, я отключаю многоадресную петлю на процессе маршрутизатора, чтобы он не «слышал, что отправляет» (как обычно для многоадресной рассылки).
Идея усложняется тем, что на той же машине выполняется «нормальный» процесс. Если многоадресная петля отключена, процесс маршрутизатора не видит трафик, исходящий от обычного процесса, и, следовательно, трафик обычного процесса не может быть перенаправлен должным образом.
Я мог бы включить многоадресную обратную связь в процессе маршрутизатора, но я не знаю, как определить процесс, который отправил пакеты. Не идентифицируя исходный процесс пакета, я застреваю в цикле:
receive_packet from 224.1.2.3:8000
--- Forward packet to 224.1.2.4:8001 ---
<< Forwarding causes a receive packet >>
receive_packet from 224.1.2.4:8001
--- Forward packet to 224.1.2.3:8000 ---
<< Forwarding causes a receive packet >>
К сожалению, я не могу просто закодировать эту информацию в отправляемые пакеты.
Есть идеи? Вся помощь очень ценится.
- Дан
Edit:
Мой коллега предложил внедрить третью группу многоадресной рассылки специально для обычного клиента, чтобы отправлять данные на маршрутизатор. В этом сценарии обычный клиент прослушивает 224.1.2.3:8000 и отправляет через 224.1.2.3:8002. Маршрутизатор также прослушивает 8002 и передает его соответствующим образом. Он просто никогда не будет отправлять что-либо через 8002 (то есть он будет рассматривать 8002 как односторонний канал от обычного клиента.)
Это на самом деле работает во многих случаях, но, к сожалению, базовое программное обеспечение требует двухсторонней связи через многоадресный сокет во время ряда общих операций. Так что это не пойдет.