Определить отправителя данных многоадресного сокета - PullRequest
1 голос
/ 17 марта 2011

У меня на компьютере работают два процесса:

  1. Обычная отправка клиентской программы на многоадресную рассылку 224.1.2.3:8000
  2. Процесс "Маршрутизатор"

Процесс маршрутизатора объединен в две многоадресные группы:

  1. 224.1.2.3: 8000
  2. 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 как односторонний канал от обычного клиента.)

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

Ответы [ 2 ]

2 голосов
/ 23 марта 2011

Возможно, клиент на том же компьютере, что и маршрутизатор , привязан к виртуальному интерфейсу , поэтому его IP-адрес источника будет отличаться от IP-адреса маршрутизатора.

0 голосов
/ 27 марта 2011

Хорошо, вот что я должен был сделать, чтобы это заработало:

Предложение Джеффа заставило меня задуматься об использовании двух виртуальных интерфейсов (по одному для каждой программы). К сожалению, я не смог найти способ отправкиданных между ними, если бы я дал каждому интерфейсу обычный IP-адрес из ограниченного блока (т. е. 192.168.1.100 & .101.)

Затем я подумал о том, чтобы дать каждому интерфейсу IP из диапазона обратной связи (127. *).К сожалению, Windows не позволяет назначать IP-адреса в пространстве обратной петли - появляется сообщение о том, что 127 резервируется, как только вы вводите его в блок IP-адреса.

Поэтому я решил просто связать вручнуюна указанный IP в моей программе.C # позволяет привязывать к адресам 127. *, поэтому я в конечном итоге использовал 127.0.0.2 и 127.0.0.3 - предоставляя уникальный для каждого процесса.

Это не решило многоадресную часть проблемы - процесс маршрутизатора не мог видеть трафик обычного процесса.Итак, мне пришлось написать модуль UDP для одноадресной рассылки, чтобы они могли общаться (я мог бы использовать TCP, но приложение настроено на использование UDP.)

Это в конечном итоге и помогло.

+ 1 к сообщению Джеффа, указывающего мне правильное направление

- Дэн

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...