Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0038: Informationen über Domains ermitteln

 von 

Beschreibung

WHOIS ist ein Service über den Informationen zu Domains anhand des Namens oder der IP-Adresse ermittelt werden können. Die vergebenden Instanzen (die Domainnamen und IP-Adressen vergeben) stellen großteils einen WHOIS-Service bereits, der über den Port 43 erreicht werden kann. Ein Beispiel dafür wäre whois.nic.de, bei dem Informationen über einen Teil der .de-Domains ermittelt werden können. Eine Liste mit vielen WHOIS-Servern weltweit kann man unter http://www.stanford.edu/group/networking/email/EMailBook_6.html einsehen. Das Format der von den WHOIS-Servern zurückgegebenen Daten ist von Server zu Server verschieden. Das hat u.a. den Grund, automatisierte Auswertungen der Daten zu verhindern.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Framework-Version(en):

.NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [3,18 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2002/2003
' Option Strict:    An
' Option Explicit:  An
'
' Referenzen: 
'  - System
'

' ##############################################################################
' ################################## Main.vb ###################################
' ##############################################################################
Option Explicit On 
Option Strict On
Option Compare Binary

Imports System

' <remarks>
'   Stellt den Einsprungspunkt der Anwendung bereit.
' </remarks>
Public Class Main

    ' <summary>
    '   Der Einsprungspunkt der Anwendung.
    ' </summary>
    Public Shared Sub Main()
        Console.Write("Domain (z.B. ""siemens.de"" oder eine IP-Adresse): ")
        Dim wr As New WhoisResolver()
        wr.Domain = Console.ReadLine()
        Console.Write("WHOIS-Server (leere Eingabe für automatische Suche): ")
        wr.WhoisServer = Console.ReadLine()
        wr.AutoSearch = (wr.WhoisServer.Length = 0)

        Try
            Console.WriteLine(wr.Resolve())
        Catch ex As Exception
            Console.WriteLine("Fehler: {0}", ex.Message)
        End Try
    End Sub
End Class
' ##############################################################################
' ############################# WhoisResolver.vb ###############################
' ##############################################################################
Option Explicit On 
Option Strict On
Option Compare Binary

Imports Microsoft.VisualBasic
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text

' <remarks>
'   Stellt Funktionalität zum Einholen von 
'   WHOIS-Informationen über eine Domain bereit.
' </remarks>
Public Class WhoisResolver
    Private m_strDomain As String
    Private m_strWhoisServer As String
    Private m_blnAutoSearch As Boolean

    ' <summary>
    '   Erstellt eine neue Instanz der Klasse.
    ' </summary>
    Public Sub New()
        Me.Domain = ""
        Me.WhoisServer = ""
        Me.AutoSearch = True
    End Sub

    ' <summary>
    '   Gibt den Namen der Domain, zu der die 
    '   Informationen ermittelt werden sollen 
    '   an oder gibt ihn zurück.
    ' </summary>
    ' <value>Name der Domain, zu der 
    '    Informationen ermittelt werden sollen.</value>
    Public Property Domain() As String
        Get
            Return m_strDomain
        End Get
        Set(ByVal Value As String)
            m_strDomain = Value
        End Set
    End Property

    ' <summary>
    '   Gibt den Namen des WHOIS-Servers, 
    '   über den die Informationen ermittelt 
    '   werden sollen,
    '   an oder gibt ihn zurück.
    ' </summary>
    ' <value>Name des WHOIS-Servers.</value>
    '
    ' Liste mit vielen WHOIS-Servern:
    ' http://www.stanford.edu/group/networking/email/EMailBook_6.html
    '
    Public Property WhoisServer() As String
        Get
            Return m_strWhoisServer
        End Get
        Set(ByVal Value As String)
            m_strWhoisServer = Value
        End Set
    End Property

    ' <summary>
    '   Gibt an oder zurück, ob automatisch ein 
    '   passender WHOIS-Server gesucht werden soll.
    '   Hat die Eigenschaft den Wert <c>False</c>, 
    '   dann wird der in der Eigenschaft
    '   <c>WhoisServer</c> angegebene Server benutzt.
    ' </summary>
    ' <value>
    '   Boolescher Wert, der angibt, ob automatisch 
    '   ein passender WHOIS-Server gesucht werden soll.
    ' </value>
    Public Property AutoSearch() As Boolean
        Get
            Return m_blnAutoSearch
        End Get
        Set(ByVal Value As Boolean)
            m_blnAutoSearch = Value
        End Set
    End Property

    ' <summary>
    '   Stellt die Anfrage nach dem in der 
    '   Eigenschaft <c>Domain</c> angegebenen Server
    '   an einen WHOIS-Server und gibt die 
    '   ermittelten Informationen zurück.
    ' </summary>
    ' <returns>Informationen über eine Domain, 
    '    die vom WHOIS-Server zurückgegeben wurden.</returns>
    ' <exception cref="Exception">Ein Fehler beim 
    '    stellen des Request ist aufgetreten.</exception>
    ' <exception cref="ArgumentException">Die angegebene 
    '    Domain ist ungültig.</exception>
    Public Function Resolve() As String

        ' Ermitteln des durch den Benutzer 
        ' angegebenen(WhoIs - Servers, beispielsweise)
        ' whois.nic.de:43/TCP und ablegen in einem 
        ' Endpunkt, der vom Socket verwendet wird,
        ' um zur Site zu verbinden.
        Dim strWhoisServer As String = WhoisServer
        If Me.AutoSearch Then
            Dim n As Integer = Me.Domain.LastIndexOf(".")
            If n < 0 OrElse n = Me.Domain.Length Then
                Throw New ArgumentException()
            End If
            strWhoisServer = Me.Domain.Substring(n + 1) & _
              ".whois-servers.net"
        End If

        Dim iphost As IPHostEntry
        Try
            iphost = Dns.Resolve(strWhoisServer)
        Catch ex As Exception

            ' Hier kann ein Fehler auftreten, dessen 
            ' Ursache unklar ist. Beispielsweise
            ' kann nicht auf whois.th-chemnitz.de 
            ' verbunden werden.
            Throw ex
        End Try

        ' IP-End an der erstbesten IP-Adresse wählen.
        Dim ipend As IPEndPoint = _
          New IPEndPoint(iphost.AddressList(0), 43)

        Dim strResponse As String = ""
        Dim socket As Socket = Nothing
        Try

            ' Erstellen eines Internet TCP-Sockets.
            socket = _
                New Socket( _
                    AddressFamily.InterNetwork, _
                    SocketType.Stream, _
                    ProtocolType.Tcp _
                )

            ' Verbinden zum Endpunkt.
            socket.Connect(ipend)

            ' Senden der Anfrage. Request 
            ' als Byte-Array für das Socket 
            ' zum Senden vorbereiten.
            socket.Send(Encoding.ASCII.GetBytes( _
              Me.Domain & ControlChars.CrLf), _
              SocketFlags.None)

            ' Ermitteln der Antwort und decodieren derselben.
            Dim abytIn(1023) As Byte
            ' Allokieren von 1024 Elementen.
            Dim intReceived As Integer = socket.Receive(abytIn)
            Do While intReceived > 0
                strResponse &= _
                    Encoding.ASCII.GetString( _
                        abytIn, _
                        0, _
                        intReceived _
                    )
                intReceived = socket.Receive(abytIn)
            Loop

            ' Daten ermittelt, aufräumen.
            socket.Shutdown(SocketShutdown.Both)
            socket.Close()
        Catch ex As Exception
            Throw ex
        Finally
            If Not socket Is Nothing Then
                socket.Close()
            End If
        End Try

        ' Ermittelte Antwort zurückgeben. 
        Return strResponse
    End Function
End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 3 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Christian Benz am 13.10.2011 um 20:46

Hallo,

ich habe das Beispielprojekt down geladen und in Visual Basic .NET 2005 erst mal konvertieren müssen.

Danach wollte das Programm nicht so recht, hier der Ablauf:

Domain (z.B. "siemens.de" oder eine IP-Adresse): siemens.de
WHOIS-Server (leere Eingabe für automatische Suche):
% Error: 55000000002 Connection refused; access control limit exceeded

Was muss ich machen, damit ich es zum laufen bekomme?

Beste Grüße

Christian Benz

Kommentar von thE_iNviNciblE am 13.07.2008 um 15:53

@Mario:
Bei mir auch, probier doch mal andere Whois Server...

Kommentar von Mario am 10.09.2005 um 21:16

Der Code liefert aber keine Informationen ala WhoIs sondern nur ob die Domain "conected" ist oder nicht. Ansonsten keinerlei Informationen.