Свяжите сокет с другим интерфейсом - PullRequest
3 голосов
/ 05 мая 2009

Существует ли существующая библиотека Linux / POSIX C / C ++ или пример кода для перепривязки сокета с одного физического интерфейса на другой?

Например, у меня есть ping-передача по сокету, который связан с физическим соединением A, и я хочу повторно привязать этот сокет к физическому соединению B и продолжить отправку и прием пакетов ping по соединению B (после небольшой задержки во время переключения).

Мне это нужно только для протоколов без сессий.

Спасибо

Обновление:

Я пытаюсь предоставить отказоустойчивое решение для использования с устройствами PPP и Ethernet.

У меня есть базовый сценарий, который может реализовать 90% функциональности за счет использования iptables, NAT и таблицы маршрутизации.

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

Я говорил с парой людей, которые работают на коммерческих маршрутизаторах, и они предлагают повторно привязать сокет к вторичному интерфейсу.

Обновление 2:

Прошу прощения, что не уточнил это ранее. Это решение будет работать на маршрутизаторе. Я не могу изменить программу ping, потому что она будет работать на клиентском компьютере. Я использовал ping в качестве примера, любое соединение, которое не основано на сеансах, должно быть способным к переключению. Я протестировал эту функцию на нескольких коммерческих маршрутизаторах, и она работает. К сожалению, их программное обеспечение является проприетарным, однако из различных разговоров и испытаний я обнаружил, что они перепривязывают сокеты при отработке отказа.

Ответы [ 3 ]

3 голосов
/ 06 мая 2009

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

Вам нужно изменить программу ping. Вы можете использовать подход «сокет для интерфейса» и каким-то образом сообщить программе, когда происходит сбой. Или вам придется закрыть сокет и затем привязать ко второму интерфейсу.

Вы можете получить информацию об интерфейсе, требуемую несколькими способами, включая вызов ioctl () с опцией SIOCGIFCONF и цикл по возвращаемым структурам для получения информации об адресе интерфейса.

0 голосов
/ 06 мая 2009

Я не совсем уверен, чего вы пытаетесь достичь, но у меня есть предположение ... Вы пытаетесь выполнить какое-то переключение при сбое? Если это так, то действительно есть способы сделать это, но почему бы не сделать это в ОС, а не в приложении?

На одном конце вы можете использовать CARP , а на другом вы можете использовать интерфейсную связь / соединение (терминология варьируется) в режиме отработки отказа.

0 голосов
/ 05 мая 2009

Я не думаю, что это довольно четко определенная операция. физические интерфейсы имеют разные MAC-адреса, поэтому, если у вас нет уровня маршрутизации, отображающего их (NAT или тому подобное), у них будут разные IP-адреса.

Порты идентифицируются тройкой <IP addr, Port number, protocol>, поэтому, если ваш IP-адрес изменится, порт изменится.

Что вы действительно пытаетесь здесь сделать?

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