|
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)
|