Как выполнить "хост-сервер nslookup"

Мой сервис C# должен периодически опросить nslookup host server. В настоящее время он запускает Process, который выполняет пакетный пакет script. Из-за соображений производительности я собираюсь сделать эту проверку, используя некоторые API. Но проблема в том, что, используя, например, System.Net.Dns.GetHostAddresses, я могу только эмулировать проверку nslookup host, но не nslookup host server (без секунд param).

Я посмотрел на кучу похожих вопросов SO, но никто из них, похоже, не решил мою проблему.

Есть ли способ выполнить nslookup host server в C# без использования какой-либо тяжелой библиотеки третьего образца?

Ответ 1

Проблема решена!

http://msdn.microsoft.com/en-us/library/ms682016(VS.85).aspx

Смотрите раздел Отличный пример здесь

[DllImport("dnsapi", EntryPoint="DnsQuery_W", CharSet=CharSet.Unicode, SetLastError=true, ExactSpelling=true)]
private static extern int DnsQuery([MarshalAs(UnmanagedType.VBByRefStr)]ref string pszName, QueryTypes wType, QueryOptions options, int aipServers, ref IntPtr ppQueryResults, int pReserved);
[DllImport("dnsapi", CharSet=CharSet.Auto, SetLastError=true)]
private static extern void DnsRecordListFree(IntPtr pRecordList, int FreeType);

...

Ответ 2

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

Существует несколько бесплатных и платных вариантов. Моя реализация была основана на публикации в CodeProject, которая работала достаточно хорошо. DNS-клиентская библиотека для .NET (также упоминаемая kprobst) была выпущена после того, как я закончил свою работу, или я бы сначала использовал ее.

Ответ 3

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