RECHERCHE

Plan du site

BOURSE

 

RUBRIQUES

 
 TUTORIELS 

Emettre une requête Whois en ASP.NET
Par Jean-Christophe Janicot, Webmaster, ASP-Magazine.com

Une méthode pour se connecter à un serveur de Whois, et l'interroger pour obtenir des informations relatives à un nom de domaine. Illustration du fonctionnement de la classe TcpClient.  ( 24 avril 2001)
 

ASP.NET comme membre de l'architecture .NET dispose de toute sa puissance, et par voie de conséquence des classes proposées par le .NET Framework. Cet article vous propose une rencontre avec la classe TcpClient. Celle-ci fournit des méthodes et propriétés capables de gérer une connexion TCP cliente. Avec son aide, nous interrogeons plusieurs serveurs de Whois afin d'obtenir des informations relatives à un nom de domaine. Les serveurs de Whois appelés seront celui de Networksolutions (.com, .net; .org) et celui de l'Afnic (.fr).

La connexion à un serveur de Whois s'effectue via un appel TCP sur le port 43. Chaque serveur est identifié par un nom unique :

* Neworsolutions : whois.networksolutions.com
* Afnic : whois.nic.fr

Remarque : chaque domaine particulier, dispose de son propre serveur de Whois. Ainsi si vous souhaitez recevoir des informations sur un serveur belge (.be), vous devrez vous connectez au serveur whois.dns.be, pour les domaines en .gov, ce sera whois.nic.gov ...

Le principe de connexion à un serveur est relativement simple :

1- Vous vous connectez sur un serveur de Whois via la protocole TCP
2- Vous envoyez vers ce serveur le nom d'un domaine à rechercher
3- Vous recevez du serveur des informations sur ce domaine

Pour mettre en place cette application, nous ajoutons à notre page les contrôles serveurs suivant :

* host : champ texte contenant le nom de domaine à rechercher
* result : champ label contenant les informations du nom de domaine renvoyées par le serveur de whois
* Un bouton de commande pour poster les données du formulaire

<form runat="server">
Entrez un nom de domaine :<br>
<asp:textBox id="host" runat="server" />
<br>
<asp:button Text="Chercher" runat="server" />
<hr size=1>
<br><b>Résultat de votre recherche</b><br>
<asp:label id="result" runat="server" />
</form>

Le .NET FrameWork nous permet d'effectuer des appels TCP vers un serveur par l'intermédiaire de l'espace de nom System.Net.Sockets et d'une de ses classes : TcpClient. Nous importerons cet espace de nom en entête de nos pages :

<% @Import Namespace="System.Net.Sockets" %>

La méthode connect de TcpClient effectue un connexion vers un serveur sur un port particulier. Par exemple, les lignes suivantes ouvrent un canal vers le serveur de Whois de NetWorkSolutions.

[VB]
Dim whois as TcpClient = new TcpClient()
whois.Connect("whois.networksolutions.com", 43)

[C#]
TcpClient whois = new TcpClient();
whois.Connect("whois.networksolutions.com", 43);

Une fois la connexion ouverte, un canal de communication est établit entre le client qui effectue l'appel et le serveur. Remarquez que contrairement au protocole http, nous travaillons ici dans un système de type connecté (type client/serveur). Ce canal de communication est établit de manière persistante jusqu'à ce que le client ou le serveur décide de terminer la communication. Il permettra le passage d'un flux de données qui pourra être écrit ou lu par le client.

La méthode GetStream de la classe TcpClient renvoie un objet NetWorkStream (flux de données de type Stream) :

[VB]
Dim netStr as NetworkStream = whois.GetStream()

[C#]
NetworkStream netStr = whois.GetStream();

Les propriétés CanRead et CanWrite de cet objet, testent si le flux est ouvert respectivement en lecture et en écriture. Dans un premier temps nous écrivons dans le flux le nom du domaine à rechercher, la méthode Write de l'objet NetWorkStream effectue cette opération pour nous. Nous lui fournissons en paramètres :

* OctetEnvoyes : un tableau d'octets contenant le nom de domaine entré dans le champ host
* 0 : la position de lecture du premier élément dans le tableau
* octetsEnvoyes.Length : le nombre d'éléments à envoyer

Pour utiliser cette méthode nous transformons la chaîne de texte host.Text en tableau d'octets.

[VB]
if (netStr.CanWrite) then
  Dim octetsEnvoyes() as Byte= Encoding.ASCII.GetBytes(host.Text & Vbcrlf)
  netStr.Write(octetsEnvoyes, 0, octetsEnvoyes.Length)
else
...

[C#]
if (netStr.CanWrite) {
  Byte[] octetsEnvoyes= Encoding.ASCII.GetBytes(host.Text + "\r\n");
  netStr.Write(octetsEnvoyes, 0, octetsEnvoyes.Length);
} else {
...

La demande à ce stade a été faîte au serveur de Whois, il ne nous reste plus qu'à récupérer sa réponse. De la même manière que la demande, nous récupérons les données renvoyées du serveur dans un tableau d'octets octetsRecus, la méthode statique Encoding.ASCII.GetString transforme se tableau en chaîne de caractère que nous ajoutons au résultat. La dimension du tableau OctetsRecus est déterminée par la taille du buffer de réception de la classe TcpClient : whois.ReceiveBufferSize. Autrement dit, nous lisons ici par morceau la réponse du serveur, il est donc utile de placer tout le code dans une boucle, afin de procéder à la totalité de la lecture de la réponse. L'arrêt de la boucle s'effectue lorsque le premier élément du tableau d'octets prend la valeur 0. Ce qui signifie qu'il n'y a plus d'octets à lire dans le flux.

[VB]
if (netStr.CanRead) then
  dim returndata as string =""
  dim octetsRecus() As Byte
  do
    Redim octetsRecus(whois.ReceiveBufferSize)
    netStr.Read(octetsRecus, 0, CInt(whois.ReceiveBufferSize))
    returndata = Encoding.ASCII.GetString(octetsRecus)
    result &=returndata.Replace(Vblf,"<br>")
  Loop while (octetsRecus(0)<>0)
else
...

[C#]
if (netStr.CanRead) {
  string returndata="";
  byte[] octetsRecus;
  do {
    octetsRecus= new byte[whois.ReceiveBufferSize];
    netStr.Read(octetsRecus, 0, (int) whois.ReceiveBufferSize);
    returndata = Encoding.ASCII.GetString(octetsRecus);
    result+=returndata.Replace("\n","<br>");
  } while (octetsRecus[0]!=0);
} else {
...

La méthode Close de la classe TcpClient termine la connexion avec le serveur et ferme le canal de communication.

[VB]
whois.Close()
return true

[C#]
whois.Close();
return true;

Voici le code complet de la fonction Mywhois, celle-ci renvoie un booléen indiquant que la demande a été traitée avec succès ou non. Cette fonction admet en paramètre les arguments suivant :

* serveur : nom du serveur de Whois
* domaine : nom de domaine à tester
* result : réponse renvoyée par le serveur de Whois

Notez que l'argument result est une chaîne de caractères passées par référence. Elle contiendra à l'issue de l'exécution de la fonction, la réponse du serveur.

[VB]
function Mywhois (byval serveur as string, byval domaine as string, byref result as string) as boolean
  Dim whois as TcpClient = new TcpClient()
  try
    whois.Connect(serveur, 43)
  catch
    whois.Close()
    ' arrêt d'exécution et renvoie la valeur faux
    return false
    exit function
  end try

  Dim netStr as NetworkStream = whois.GetStream()
  if (netStr.CanWrite) then
    Dim octetsEnvoyes() as Byte= Encoding.ASCII.GetBytes(domaine & Vbcrlf)
    netStr.Write(octetsEnvoyes, 0, octetsEnvoyes.Length)
  else
    whois.Close()
    ' arrêt d'exécution et renvoie la valeur faux
    return false
    exit function
  end if

  if (netStr.CanRead) then
    dim returndata as string =""
    dim octetsRecus() As Byte
    do
      Redim octetsRecus(whois.ReceiveBufferSize)
      netStr.Read(octetsRecus, 0, CInt(whois.ReceiveBufferSize))
      returndata = Encoding.ASCII.GetString(octetsRecus)
      result &=returndata.Replace(Vblf,"<br>")
    Loop while (octetsRecus(0)<>0)
  else
    whois.Close()
    ' arrêt d'exécution et renvoie la valeur faux
    return false
    exit function
  end if

  whois.Close()
  return true
end function

[C#]
bool Mywhois (string serveur, string domaine, ref string result)
{
  TcpClient whois = new TcpClient();
  try {
    whois.Connect(serveur, 43);
  } catch {
    whois.Close();
    // arrêt d'exécution et renvoie la valeur faux
    return false;
  }

  NetworkStream netStr = whois.GetStream();
  if (netStr.CanWrite) {
    Byte[] octetsEnvoyes= Encoding.ASCII.GetBytes(domaine + "\r\n");
    netStr.Write(octetsEnvoyes, 0, octetsEnvoyes.Length);
  } else {
    whois.Close();
    // arrêt d'exécution et renvoie la valeur faux
    return false;
  }

  if (netStr.CanRead) {
    string returndata="";
    byte[] octetsRecus;
    do {
      octetsRecus= new byte[whois.ReceiveBufferSize];
      netStr.Read(octetsRecus, 0, (int) whois.ReceiveBufferSize);
      returndata = Encoding.ASCII.GetString(octetsRecus);
      result+=returndata.Replace("\n","<br>");
    } while (octetsRecus[0]!=0);
  } else {
    whois.Close();
    // arrêt d'exécution et renvoie la valeur faux
    return false;
  }

  whois.Close();
  return true;
}

Nous utilisons cette fonction au sein de la procédure page_load de la page. Nous ne détaillons pas cette procédure ici, ce qu'il faut savoir simplement, c'est que nous déterminons le serveur de Whois à utiliser en fonction de la présence ou non des termes (.com, .net ou .org) pour NetworkSolutions ou (.fr) pour l'Afnic dans le nom de domaine entré par l'utilisateur.

[VB]
Sub Page_load (sender as Object , E as EventArgs)
  if (Page.IsPostBack) then
    dim domaine as string = host.Text
    dim serveur as string = ""
    dim retour as string = ""

    if (domaine.IndexOf(".fr")>0) then
      serveur="whois.nic.fr"
    end if

    if ((domaine.IndexOf(".org")>0) OR (domaine.IndexOf(".net")>0) _
OR (domaine.IndexOf(".com")>0)) then
      serveur="whois.networksolutions.com"
    end if

    if serveur<>"" then
      if Mywhois(serveur,domaine,retour) then
        result.Text=retour
      else
        result.Text="Une Erreur s'est produite"
      end if
    else
      result.Text="Aucune information disponible"
    end if
  end if
end sub

[C#]
void Page_load (Object sender, EventArgs E) {
  if (Page.IsPostBack) {
    string domaine=host.Text;
    string serveur="";
    string retour="";

    if (domaine.IndexOf(".fr")>0) {
      serveur="whois.nic.fr";
    }

    if ((domaine.IndexOf(".org")>0) || (domaine.IndexOf(".net")>0) || (domaine.IndexOf(".com")>0)) {
      serveur="whois.networksolutions.com";
    }

    if (serveur!="") {
      if (Mywhois(serveur,domaine,ref retour)) {
        result.Text=retour;
      } else {
        result.Text="Une Erreur s'est produite";
      }
    } else {
      result.Text="Aucune information disponible";
    }
  }
}

Télécharger les sources de l'exemple (inclus les versions C# et VB)

 
[ Jean-christophe Janicot,pour JDNet
 
Accueil | Haut de page
 
 

 

 
 
[an error occurred while processing this directive]