Конференция "Сети" » Программный выбор конкретного сетевого интерфейса для подключений [D7, WinXP]
 
  • maxistent © (28.11.13 09:42) [0]
    Доброго времени всем! Появилась задачка, которую уже долгое время не могу решить - потому прошу помочь...

    Имеется: два сетевых интерфейса с разными IP, масками, шлюзами и т.д. По обоим "приходит интернет" :)

    Задача: программно "переключать" интерфейсы и через каждый из них послать GET-запрос (http) на внешний сервер.

    с HTTP работаю, использую компонент idHTTP - с этим проблем нет. Запросы посылаются, ответы приходят, все ОК. Но все это дело проходит только по тому сетевому интерфейсу, который назначен в системе основным (метрика наименьшая). Менять метрику для всей системы не очень приятно.
    Думаю, можно решить это дело локально, в контексте только моего приложения?
  • brother © (28.11.13 09:47) [1]
    > По обоим "приходит интернет"


    > Но все это дело проходит только по тому сетевому интерфейсу,
    > который назначен в системе основным (метрика наименьшая)
    > .

    значит другой простаивает...
  • maxistent © (28.11.13 09:57) [2]

    > значит другой простаивает...

    Кэп, как мне Вас не хватало... =D
  • Сергей М. © (28.11.13 21:36) [3]

    > можно решить это дело локально, в контексте только моего
    > приложения?


    У IdHTTP для этого есть св-во BoundIP
  • brother © (29.11.13 07:24) [4]
    [2] я намекал на то, что если у тебя используется фактически только один интерфейс, зачем дергать за другой? или у Вас нагрузка распределяется по обоим?
  • maxistent © (29.11.13 07:42) [5]

    > или у Вас нагрузка распределяется по обоим?

    во время простоя одного из интерфейсов приложение должно проверять состояние его IP...

    > Задача: программно "переключать" интерфейсы и через каждый
    > из них послать GET-запрос (http) на внешний сервер.

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


    > У IdHTTP для этого есть св-во BoundIP

    Да, я это свойство опробовал. Обнаружил такую проблему:
    Если в системе оба интерфейса с одинаковой метрикой, то использование BoundIP дает желаемый результат. Если же метрика одно из них ниже (т.е. приоритет выше), то использование свойства BoundIP не дает желаемого результата: запрос передается через интерфейс с более высоким приоритетом, но с адресом (в BoundIP) другого интерфейса, что приводит к невозможности подключения к внешнему хосту =(
  • brother © (29.11.13 07:45) [6]
    > если IP для одного из интерфейсов изменился

    так это может быть только в одном случае и имхо маршрут просле реконнекта меняется сам...
  • brother © (29.11.13 08:01) [7]
    или маршруты с внешки до хоста надо менять?
    опишите задачу более подробно, имхо это задача не программиста, а сис админа...
  • maxistent © (29.11.13 08:38) [8]
    Описываю:

    Первый интерфейс - сетевая карта. Машина за роутером, имеет свой статический локальный IP. На другой стороне роутера "приходит интернет" ))

    Второй интерфейс - ADSL-модем (usb).

    В итоге имеем два внешних IP (динамические) и один локальный (статический)

    Смену IP на модеме я могу отследить простым вызовом некоторых функций (локально, без танцев с бубном), а вот узнать о смене внешнего IP за пределами роутера - это возможно только с помощью внешнего хоста, который "увидит" мой IP "оттуда" и сообщит мне его в http-ответе. А для этого нужно указать маршрут именно через роутер (через сетевую карту). Вот такие пироги...
  • brother © (29.11.13 08:50) [9]
    у Вас каша в голове... советую ознакомиться с основами tcp/ip сетей, многие вопросы отпадут...
    зы. ip просто так не меняеются "находу"
  • maxistent © (29.11.13 09:11) [10]
    У меня не каша в голове, а конкретная задача: произвести подключение к внешнему хосту через конкретный интерфейс, при этом менять метрику на интерфейсах, т.е. маршруты, для всей системы в целом крайне не желательно.

    с основами ip-сетей прекрасно знаком, так что вопрос остается открытым...

    p.s. Внешние IP присваиваются провайдером, меняются динамически примерно раз в сутки (иногда чаще)
  • brother © (29.11.13 09:13) [11]
    удачи!
  • maxistent © (29.11.13 09:44) [12]

    > удачи!

    спасибо, именно это мне сейчас и необходимо...
  • Сергей М. © (29.11.13 10:59) [13]

    > интерфейса с одинаковой метрикой


    Метрика она вообще-то не у интерфейса, а у маршрута.

    Если два маршрута к одной и той же целевой подсети/хосту проходят через два разных шлюза в одной и той же подсети источника, то иначе как расстановкой нужных приоритетов маршрутов (метрик) задача на прикладном уровне не решается.

    Вот если источники в разных подсетях (соответственно и шлюзы в разных подсетях), то простой биндинг к нужному локальному адресу в нужной подсети источника с легкостью решает задачу.
  • Сергей М. © (29.11.13 11:07) [14]
    И судя по

    > два сетевых интерфейса с разными IP, масками, шлюзами и  т.д


    биндинг к нужному "разному IP" обязан решить задачу.

    При условии что интерфейсы по чьей-то неразумности или прихоти не сконфигурированы так что подсети пересекаются, например, так:

    if1: 192.168.0.3/24 gw 192.168.0.1
    if2: 192.168.0.4/16 gw 192.168.0.2
  • Сергей М. © (29.11.13 11:30) [15]
    Вообще говоря, приличные маршрутизаторы кроме метрики позволяют при необходимости дополнительно ассоциировать с маршрутом еще и предпочитительный источник адрес источника.
  • maxistent © (29.11.13 11:31) [16]

    > Метрика она вообще-то не у интерфейса, а у маршрута.

    да, эт я просто уже "задрыгался" с ручной настройкой маршрутов из командной строки - "интерфейсы", "метрика"...

    1 канал: локалка, настроена банально: ip=192.168.1.10, шлюз=192.168.1.1, маска=255.255.255.0
    за "локалкой" стоит роутер с выходом во внешку (пример автоматически получаемых настроек: ip=37.99.11.50, шлюз=37.99.11.50, маска=255.255.255.255)

    2 канал: ADSL, получает настройки от DHCP автоматом (например, такие: ip=95.57.77.131, шлюз=95.57.77.131, маска=255.255.255.255)
  • Сергей М. © (29.11.13 14:04) [17]
    Ну и ?
    Биндишься к 192.168.1.10 - ходишь в Тырнет через 192.168.1.1 (а он, в свою очередь, через 37.99.11.50, если у него там на борту с маршрутами не понахреноверчено)

    Биндишься к 95.57.77.131 - ходишь туда же, но уже через 95.57.77.131
  • maxistent © (29.11.13 14:45) [18]
    ага, вот тут-то и начинается "магия"...

    192.168.1.10 метрика=1, 95.57.77.131 метрика=10, idHTTP1.BoundIP:='95.57.77.131'
    подключение неудачно

    95.57.77.131 метрика=1, 192.168.1.10 метрика=10, idHTTP1.BoundIP:='192.168.1.10'
    подключение неудачно

    единственный случай, когда это "прокатывает" - если метрика выставлена одинаковая (например равная единице)

    что может быть не так (с системой / с руками / с мозгом)?
  • maxistent © (29.11.13 14:52) [19]

    > подключение неудачно

    подключение происходит удачно, но через тот интерфейс, через который в системе прописан приоритетный маршрут (метрика=1)
 
Конференция "Сети" » Программный выбор конкретного сетевого интерфейса для подключений [D7, WinXP]
Есть новые Нет новых   [134427   +34][b:0][p:0.001]