2013-11-19 3 views

ответ

1

Нет, нет встроенного способа обнаружить все серверы MongoDB в сети. Хотя я вижу, что есть ответ, предложенный для портирования портов, это ошибочно на многих уровнях.

  1. Класс SqlDataSourceEnumerator работает, отправив широковещательный пакет в сегмент локальной сети. Это чрезвычайно эффективно, поскольку «все» устройства в этом сегменте получат пакет и имеют возможность отвечать.
  2. Порт для MongoDB, возможно, был изменен с сервера по умолчанию (а серверы конфигурации MongoDB работают по другому порту по умолчанию). Обычно я не использую порт по умолчанию, чтобы убедиться, что он где-то не закодирован. :)
  3. Без знания различных сегментов локальной сети, вы можете не знать, где на самом деле сканирования (например, какие диапазоны IP-адресов?)
  4. Это может быть сконфигурирован с помощью SSL
  5. Вы можете вызвать предупреждения о безопасности в предприятие для выполнения порта сканирования
  6. брандмауэров может блокировать трафик от несанкционированных хостов (и в типичном предприятии, это будет случай)
  7. Я бы не сделать долгосрочное использование IPV4, как предприятия перейти на IPV6

Обычно я бы рекомендовал просто централизованно хранить список активных серверов MongoDB.

+0

Я знаю, что SqlDataSourceEnumerator отправляет UDP-пакеты с использованием широковещательной передачи. Я спросил о любом способе (подобном этому классу по результату, но не по реализации), который мог бы мне помочь. Я понял, что никак ... –

+0

Я дал вам ответ, почему нет надежного способа выполнить эту операцию. Я понимаю, чего вы хотите ... это просто непрактично делать эффективно или надежно. Я должен был задать вопрос, почему вы пытаетесь это сделать?Возможно, существует лучший подход, который не требует потенциально ненадежных методов. – WiredPrairie

2

Что вы можете сделать, это найти все активные IPv4-адреса. Вы можете найти, как это сделать here (answered by Ken Fyrstenberg)

Затем используйте HttpClient object, чтобы получить ответ сформировать все IP-адреса, которые вы нашли, но на порту 27017 попробовать { // Создать объект HttpClient Новый. Клиент HttpClient = новый HttpClient();

HttpResponseMessage response = await client.GetAsync("http://localhost:27017/"); 
    response.EnsureSuccessStatusCode(); 
    string responseBody = await response.Content.ReadAsStringAsync(); 
    // Above three lines can be replaced with new helper method in following line 
    // string body = await client.GetStringAsync(uri); 

    Console.WriteLine(responseBody); //HERE you can check for "MongoDB" 
} 
catch(HttpRequestException e) 
{ 
    Console.WriteLine("\nException Caught!"); 
    Console.WriteLine("Message :{0} ",e.Message); 
} 

Ответ будет следующим образом (пример Mongod работает на конкретном IP):

Вы пытаетесь получить доступ к MongoDB на родном порту водителя. Для HTTP диагностики доступа, добавьте 1000 к номеру порта

Таким образом, используя строку ответа, вы можете выяснить, является ли экземпляр Mongod работает на конкретном IP или нет.

Это может не сработать, если настроен порт MongoDB (кроме значения по умолчанию: 27017). Для получения дополнительной информации о MongoDB's Network Exposure and Security

Смежные вопросы