DNS with C#

Mon 24 July 2006, , ,

A friend of mine asked me : “How to get the default mail server of a company (with C#)”. He tried with nslookup but without any success. So I decided to try.

Some google searchs gives me the excellent tool called dig.

$ dig he-arc.ch MX
[...]
;; ANSWER SECTION:
he-arc.ch.              180     IN      MX      10 smtpgw1.he-arc.ch.
[...]

Using dig from C# isn’t really nice. It’s a big and ugly hack.

Another try with dnsJava. First step, convert the .jar into a library or executable for Mono via IKVM. It doesn’t work because of GNU Classpath isn’t fully complete and, probably, dnsJava uses too specific classes from the JRE/JDK of Sun.

Keep googling... And this article, the paradize on earth : C# .NET DNS query component. I downloaded the sources, removed the key.snk file, compiled the library and try this sample code :

using System;
using System.Net;
using Bdev.Net.Dns;

public class DnsTest {
   public static void Main(string[] argv) {
      // Shameful hardcoding of my DNS server (CableCom DNS server)
      IPAddress dnsServerAddress = IPAddress.Parse("62.2.17.60");
      
      // Retrieve the MX records for the domain dosimple.ch
      MXRecord[] records = Resolver.MXLookup("dosimple.ch", dnsServerAddress);
      
	   // iterate through all the records and display the output
      foreach (MXRecord record in records) {
          Console.WriteLine("{0}, preference {1}", record.DomainName, record.Preference);
      }
   }
}

It works. System.Net.Dns doesn’t need to specify the DNS server so, it’s a weird behaviour. There is a bug with these classes when a domain name contains a dash '-'.

Un collègue, camarade, poteau m’a interrogé concernant la possibilité de connaître le serveur de mails d’une entreprise via C# (.Net). Il avait apparemment essayé avec nslookup, l’outil fournit par Microsoft, mais bon ce n’était pas concluant. Voici les détails de mes recherches (avec ci-dessus un développement plus fin).

L’objet intégré dans le framework System.Net.Dns ne permet pas de faire une requête avec le type de serveur.

Un autre outil, nommé dig est bien plus sympa que nslookup, mais appelé un exécutable depuis C# me semble être un gros hack.

Un nouvel essai avec le prometteur dnsJava qui une fois converti en bibliothèque pour le CLR devrait aller nickel. Le problème est qu’IKVM (ou plutôt GNU.ClassPath) n’a pas tous les outils pour faire ça. Sun is evil !.

Et pour terminé, un code déniché dans cet article : C# .NET DNS query component qui offre les outils adéquats pour obtenir le nom du serveur mail d’un domaine, avec quelques bogues toutefois.

Digg it!, so del.icio.us, blogmarks, reddit.