Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Как программно узнать адреса шлюзов всех сетевых интерфесов ubuntu  (Прочитано 1022 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DjoBlakk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Необходимо программно проверять доступность сетевых интерфейсов путем удаленного сокет подключения к серверу.

Конфигурация интерфейсов бывает различной (несколько ethernet, wi-fi и модемы) и заранее ее нельзя спрогнозировать.

В функцию передаются IPInterfaceProperties каждого интерфейса.

В процессе работы возникла проблема, gateway существует только для активного на данный момент подключения, т.е.

gateways.Count = 0 для остальных интерфейсов. Поэтому добавить маршрут и проверить соединение не получается.

Может кто сталкивался?

Или подскажет альтернативный путь.

private static bool TestConnection(IPInterfaceProperties properties, IPAddress remoteAddress,int remotePort)
        {
            bool result = false;

            try
            {
                if (remoteAddress != null)
                {
                    GatewayIPAddressInformationCollection gateways = properties.GatewayAddresses;
                    UnicastIPAddressInformationCollection addresses = properties.UnicastAddresses;

                    for (int i = 0; i < addresses.Count; i++)
                    {
                        IPAddress addr = addresses[i].Address;
                        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                        for (int j = 0; j < gateways.Count; j++)
                        {
                            GatewayIPAddressInformation gateway = gateways[j];

                            try
                            {
                                // Add the route entry to the route table to solve the Windows XP issue.
                                AddRoute(gateway.Address.ToString(), remoteAddress.ToString());

                                // Bind the address to access the remote server.
                                IPEndPoint local = new IPEndPoint(addr, 0);
                                socket.Bind(local);
                                socket.Connect(remoteAddress, remotePort);
                                result = true;
                                socket.Disconnect(true);
                                socket.Shutdown(SocketShutdown.Both);
                            }
                            catch
                            {
                                result |= false;
                            }
                            finally
                            {
                                socket.Close();

                                // Remove the route entry from the route table.
                                RemoveRoute(remoteAddress.ToString());
                            }
                        }
                    }
                }
            }

            catch (Exception ex)
            {
               
            }

            return result;
        }
« Последнее редактирование: 23 Июль 2012, 15:56:04 от DjoBlakk »

Оффлайн mkarasik

  • Участник
  • *
  • Сообщений: 163
    • Просмотр профиля
В функцию передаются IPInterfaceProperties каждого интерфейса.

Ты уверен, что тебе в этот форум?

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

Сам хоть понял, что написал?

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

Хотел еще постебаться насчет удаленного подключения к югу, но не буду. :)

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
В простейшем случае нельзя добавить 2 дефолтных шлюза (на самом деле можно, но это другая история)
Но всегда можно попрописать маршрут до какого-то адреса через заданый интерфейс. Надо естественно знать адрес шлюза на каждом интерфейсе (dhcp и тех.поддержка провайдера тебе в помощь).

Если чисто интернет проверять то просто устанавливай соединение. Установилось хорошо не установилось пусть пользователь сам думает над всеми своими интерфейсами.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Необходимо программно проверять доступность сетевых интерфейсов путем удаленного сокет
С конкретными интерфейсами можно разбираться только локально. Удаленно можно снимать статистику (того что делается локально). По другому никак или я чего-то не понял ?

Оффлайн DjoBlakk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Необходимо передавать данные через активный интерфейс с наибольшим приоритетом (Ethernet_0 ... Ethernet_N > WiFi > GPRS > Спутниковый модем).

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

Если не доступны Ethernet и WiFi, то необходимо дозваниваться по GPRS, если недоступен GPRS, то дозваниваться по спутнику.


Надо естественно знать адрес шлюза на каждом интерфейсе (dhcp и тех.поддержка провайдера тебе в помощь).

А есть варианты как можно вытащить адреса gateway при выдачи их dhcp серверами для каждого интерфейса, не обращаясь к провайдеру и не выключая активный интерфейс?
« Последнее редактирование: 23 Июль 2012, 16:06:35 от DjoBlakk »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Конечно есть. Реализуй протокол или просто пользуйся готовой реализацией.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Необходимо передавать данные через активный интерфейс с наибольшим приоритетом (Ethernet_0 ... Ethernet_N > WiFi > GPRS > Спутниковый модем).
См. реализации торрентов. Ну и маршрутизацию, конечно.

 

Страница сгенерирована за 0.086 секунд. Запросов: 24.