C # /. NET: выяснить, существует ли сервер, запрос DNS для записей SVC - PullRequest
3 голосов
/ 15 апреля 2010

Написание инструмента очистки / сервера Мне поручено найти сервер для подключения.Я бы хотел, чтобы все было как можно проще для пользователя.Таким образом, моя идея заключается в следующем:

  • Проверить, существуют ли определенные серверы (закодированные по имени) (например, «mail.xxx» для почтового сервера - мой пример не почтовый сервер);)
  • Запросить иные записи DNS SVC, что позволяет администратору настроить расположение сервера для конкретной службы (к которой подключается клиент).

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

Кто-нибудь придумает, как:

  • Чтобы выяснить,существует ли сервер и отвечает (то есть онлайн) самым быстрым способом?TCP может занять много времени, если сервера там нет.Пинг в стиле UDP звучит для меня как хорошая идея.Сам PING может быть недоступен.
  • Кто-нибудь знает, как лучше спросить у inint .NET запись SVC в конкретном (по умолчанию) домене?

Ответы [ 3 ]

4 голосов
/ 15 апреля 2010

Вы можете использовать ping из .NET, но для этого требуется IP-адрес сервера.

С здесь :

internal bool PingServer()
{
    bool netOK = false;
    // 164.110.12.144 is current server address for server: nwhqsesan02

    byte[] AddrBytes = new byte[] { 164, 110, 12, 144 }; // byte array for server address.
    using (System.Net.NetworkInformation.Ping png = new System.Net.NetworkInformation.Ping())
    {
        System.Net.IPAddress addr;
        // Sending ping to a numeric byte address has the best change of 
        // never causing en exception, whether network connected or not.
        addr = new System.Net.IPAddress(AddrBytes);
        try
        {
            netOK = (png.Send(addr, 1500, new byte[] { 0, 1, 2, 3 }).Status == IPStatus.Success);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString()); 
            netOK = false;
        }
        return netOK;
    }
}

РЕДАКТИРОВАТЬ: Как насчет этого:

bool ConnectionExists()
{
    try
    {
        System.Net.Sockets.TcpClient clnt=new System.Net.Sockets.TcpClient("www.google.com",80);
        clnt.Close();
        return true;
    }
    catch(System.Exception ex)
    {
        return false;
    }
}
2 голосов
/ 21 ноября 2011

К вашей проблеме я бы порекомендовал совершенно другое решение:

  1. на сервере внедрите сервер icmp на каком-то настраиваемом порту, где вы принимаете несколько "вы там?" сообщение и ответьте "да, я";
  2. на стороне клиента вы транслируете сообщение "вы там" на конкретный порт. Таким образом, ваш клиент всегда будет знать, какие серверы доступны. Он будет работать намного быстрее и без установки или настройки какой-либо службы DNS.
1 голос
/ 19 апреля 2010

Лучший способ проверить, существует ли служба и работает ли она, возможно, с использованием собственного протокола этой службы.В противном случае я бы использовал ping (ICMP ECHO).

Что касается поиска SRV-записи (я предполагаю, что вы имеете в виду "SRV", поскольку нет типа "SVC"), вы можете использовать "DNS-клиент"Библиотека для .NET "(http://www.simpledns.com/dns-client-lib.aspx) - например:

var Response = JHSoftware.DnsClient.Lookup("_ftp._tcp.xyz.com", 
                                       JHSoftware.DnsClient.RecordType.SRV);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...