.Net Adventures http://blogs.ugidotnet.org/tekanet/Default.aspx Appunti di viaggio dall'universo .Net it-IT Matteo Bagattini Subtext Version 2.6.0.0 .Net Adventures http://blogs.ugidotnet.org/images/RSS2Image.gif http://blogs.ugidotnet.org/tekanet/Default.aspx 77 60 Interrogare server Whois con .Net .Net softcore http://blogs.ugidotnet.org/tekanet/archive/2005/06/16/19352.aspx Come spesso accade, ci si ritrova a risolvere, grazie al Framework, problemi apparentemente intricati con poche righe di codice.<br> E' il caso della classe che vi propongo, che esegue un'interrogazione ad un server Whois, ricevendo in cambio il record corrispondente (o un segnale di "not found") al dominio richiesto. Innanzitutto i namespace da importare, che sono: <code> Imports System.Net<br> Imports System.Net.Sockets<br> Imports System.Text<br> Imports System.IO </code> La logica dietro a questa classe sarà quella di inzialmente impostare tramite delle property R/W il server Whois da interrogare, il dominio da verificare e l'eventuale porta TCP (di fatto è sempre la 43 per i Whois). <code> Private m_WhoisServer As String = String.Empty<br> Private m_Port As Integer = 43<br> Private m_Domain As String = String.Empty<br> <br> Public Property Domain() As String<br> Get<br> Return m_Domain<br> End Get<br> Set(ByVal Value As String)<br> m_Domain = Value + vbCrLf<br> End Set<br> End Property<br> <br> Public Property Port() As Integer<br> Get<br> Return m_Port<br> End Get<br> Set(ByVal Value As Integer)<br> m_Port = Value<br> End Set<br> End Property<br> <br> Public Property WhoisServer() As String<br> Get<br> Return m_WhoisServer<br> End Get<br> Set(ByVal Value As String)<br> m_WhoisServer = Value<br> End Set<br> End Property<br> </code> Per comodità, un overload del costruttore accetta direttamente server e dominio da verificare: <code> Public Sub New()<br> '<br> End Sub<br> <br> Public Sub New(ByVal WhoisServer As String, ByVal Domain As String)<br> Me.WhoisServer = WhoisServer<br> Me.Domain = Domain<br> End Sub<br> </code> Infine il codice principale, che esegue la query. Utilizzo un oggetto TcpClient, lo connetto al server e alla porta richiesto e imposto un timeout accettabile. Quindi passo, codificato in ASCII.GetBytes, il dominio da verificare. Da notare che quando viene impostata la property Domain, aggiungo alla fine il carattere di ritorno a capo: non settando questa chiusura, la richiesta al server rimane "appesa" (si può verificare la query anche tramite Telnet). Infine, leggo in uno streamreader il risultato restituito dal server. <code> Public Function Query() As String<br> <br> Dim TCPC As New TcpClient<br> Dim sReturn As String<br> <br> Try<br> TCPC.Connect(Me.WhoisServer, Me.Port)<br> TCPC.ReceiveTimeout = 5000<br> Dim arrDomain As Byte() = Encoding.ASCII.GetBytes(Me.Domain.ToCharArray)<br> Dim s As Stream = TCPC.GetStream<br> s.Write(arrDomain, 0, Me.Domain.Length)<br> Dim sr As New StreamReader(TCPC.GetStream(), Encoding.ASCII)<br> <br> sReturn = sr.ReadToEnd<br> <br> TCPC.Close()<br> Catch e As Exception<br> sReturn = "Errore di comunicazione con il server " + Me.WhoisServer<br> End Try<br> <br> Return sReturn<br> <br> End Function<br> </code> Ho utilizzato un blocco try-catch anche se preferisco sempre farne a meno, poichè ho sviluppato la classe in fretta e non ho potuto analizzare attentamente la gestione degli errori derivanti dall'oggetto TcpClient. Se qualcuno ha soluzioni più eleganti, sono sempre ben accette! That's all folks :) tK<img src="http://blogs.ugidotnet.org/tekanet/aggbug/19352.aspx" width="1" height="1" /> Matteo Bagattini http://blogs.ugidotnet.org/tekanet/archive/2005/06/16/19352.aspx Thu, 16 Jun 2005 10:32:00 GMT http://blogs.ugidotnet.org/tekanet/archive/2005/06/16/19352.aspx#feedback 9 http://blogs.ugidotnet.org/tekanet/comments/commentRss/19352.aspx http://blogs.ugidotnet.org/tekanet/services/trackbacks/19352.aspx