dheenu27
asked on
List of primary and Secondary DNS servers in VB.net
Hello,
Can anyone tell me how to get the ip addresses of primary and secondary DNS servers using VB.net. I need this info very urgently.
Thanks a million.
Dheenu
Can anyone tell me how to get the ip addresses of primary and secondary DNS servers using VB.net. I need this info very urgently.
Thanks a million.
Dheenu
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
I have a VB.Net version of ping.... (shamelessly stolen from the Microsoft examples)
I use it like this:
Dim Packet As New ICMP_Packet.CPing
Dim oops as boolean
oops = False
Packet.HostName = RemotePC
If Packet.Open Then
' Establish a socket connection, and then send a packet by using ICMP.
retValue = Packet.Ping
If retValue < 0 Then
oops = True
msgbox(RemotePC & ": Host Unreachable")
End If
Packet.Close()
Else
oops = True
msgbox(RemotePC & ": Host Unknown")
End If
-------------------------- ---------- ---------- ---------- ---------- ---------- --
Imports System.Net.Sockets
Imports System.Net
Imports System
Imports System.Runtime.InteropServ ices
Namespace ICMP_Packet
' Define the structure of an ICMP packet.
' This structure contains packet information.
Structure IcmpPacket
Dim type_message As Byte ' type of message
Dim subCode_type As Byte ' type of sub-code
Dim complement_checkSum As UInt16 ' one's complement checksum for the structure
Dim identifier As UInt16 ' identifier
Dim sequenceNumber As UInt16 ' sequence number
Dim data() As Byte ' data
Public Sub Initialize(ByVal type As Byte, ByVal subCode As Byte, ByVal payload() As Byte)
Dim index As Integer
Dim buffer_icmpPacket() As Byte
Dim cksumBuffer() As UInt16
Dim icmpHeaderBufferIndex As Int32 = 0
Me.type_message = type
Me.subCode_type = subCode
complement_checkSum = UInt16.Parse("0")
identifier = UInt16.Parse("45")
sequenceNumber = UInt16.Parse("0")
data = payload
' Declare a variable to store the total packet size.
' Call the Serialize method to count the total number of bytes in the packet.
buffer_icmpPacket = Serialize()
' Resize a UInt16 array to half the size of the packet.
ReDim cksumBuffer((buffer_icmpPa cket.Lengt h() \ 2) - 1)
' Initialize the UInt16 array.
For index = 0 To (cksumBuffer.Length() - 1)
cksumBuffer(index) = BitConverter.ToUInt16(buff er_icmpPac ket, icmpHeaderBufferIndex)
icmpHeaderBufferIndex += 2
Next index
'Call a method that returns a checksum.
complement_checkSum = MCheckSum.Calculate(cksumB uffer, cksumBuffer.Length())
End Sub
Public Function Size() As Integer
Return (8 + data.Length())
End Function
' The Serialize method converts the packet to a byte array to calculate the total size.
Public Function Serialize() As Byte()
Dim b_seq() As Byte = BitConverter.GetBytes(sequ enceNumber )
Dim b_cksum() As Byte = BitConverter.GetBytes(comp lement_che ckSum)
Dim b_id() As Byte = BitConverter.GetBytes(iden tifier)
Dim index As Int32 = 0
Dim buffer() As Byte
ReDim buffer(Size() - 1)
' Serialize the structure into the array.
buffer(0) = type_message
buffer(1) = subCode_type
index += 2
Array.Copy(b_cksum, 0, buffer, index, 2)
index += 2
Array.Copy(b_id, 0, buffer, index, 2)
index += 2
Array.Copy(b_seq, 0, buffer, index, 2)
index += 2
' Copy the data.
If (data.Length() > 0) Then
Array.Copy(data, 0, buffer, index, data.Length())
End If
Return buffer
End Function
End Structure
' The CPing class.
Public Class CPing
Private Const DEFAULT_TIMEOUT As Integer = 1000
Private Const SOCKET_ERROR As Integer = -1
Private Const PING_ERROR As Integer = -1
Private Const ICMP_ECHO As Integer = 8
Private Const DATA_SIZE As Integer = 32
Private Const RECV_SIZE As Integer = 128
Private _open As Boolean = False
Private _initialized As Boolean
Private _recvBuffer() As Byte
Private _packet As IcmpPacket
Private _hostName As String
Private _server As EndPoint
Private _local As EndPoint
Private _socket As Socket
Public Sub New(ByVal hostName As String)
Me.HostName() = hostName
ReDim _recvBuffer(RECV_SIZE - 1)
End Sub
Public Sub New()
' Set the default host name to the local host.
Me.HostName() = Dns.GetHostName()
ReDim _recvBuffer(RECV_SIZE - 1)
End Sub
Private Overloads Sub finalize()
' Ensure that you close the socket.
Me.Close()
Erase _recvBuffer
End Sub
' Get and set the current host name.
Public Property HostName() As String
Get
Return _hostName
End Get
Set(ByVal Value As String)
_hostName = Value
' If the CPing object is already open, close it and then reopen it by using a new host name.
If (_open) Then
Me.Close()
Me.Open()
End If
End Set
End Property
' Get the state (open or closed).
Public ReadOnly Property IsOpen() As Boolean
Get
Return _open
End Get
End Property
' Create a socket to host remote end points and local end points.
Public Function Open() As Boolean
Dim payload() As Byte
If (Not _open) Then
Try
' Initialize the packet.
ReDim payload(DATA_SIZE)
_packet.Initialize(ICMP_EC HO, 0, payload)
' Initialize an ICMP socket.
_socket = New Socket(AddressFamily.Inter Network, SocketType.Raw, ProtocolType.Icmp)
' Set the server end point.
If _hostName.ToLower.IndexOfA ny("abcdef ghijklmnop qrstuvwxyz -") >= 0 Then
_server = New IPEndPoint(Dns.GetHostByNa me(_hostNa me).Addres sList(0), 0)
Else
_server = New IPEndPoint(IPAddress.Parse (_hostName ), 0)
End If
' Set the receiving end point as your client computer.
_local = New IPEndPoint(Dns.GetHostByNa me(Dns.Get HostName() ).AddressL ist(0), 0)
_open = True
Catch
Return False
End Try
End If
Return True
End Function
' Destroy the socket and end points (if necessary).
Public Function Close() As Boolean
If (_open) Then
_socket.Close()
_socket = Nothing
_server = Nothing
_local = Nothing
_open = False
End If
Return True
End Function
' Perform a PING operation.
Public Overloads Function Ping() As Integer
Return Ping(DEFAULT_TIMEOUT)
End Function
' The Ping method performs a PING operation.
Public Overloads Function Ping(ByVal timeOutMilliSeconds As Integer) As Integer
' Initialize the time-out value.
Dim timeOut As Integer = timeOutMilliSeconds + Environment.TickCount()
' Send the packet.
Try
If (SOCKET_ERROR = _socket.SendTo(_packet.Ser ialize(), _packet.Size(), 0, _server)) Then
Return PING_ERROR
End If
Catch
Return PING_ERROR
End Try
' Use the following loop to check the response time until you receive a time-out.
Do
' Poll the read buffer every millisecond.
' If data exists, read the data and return the round-trip time.
If (_socket.Poll(1000, SelectMode.SelectRead)) Then
_socket.ReceiveFrom(_recvB uffer, RECV_SIZE, 0, _local)
Return (timeOutMilliSeconds - (timeOut - Environment.TickCount()))
ElseIf (Environment.TickCount() >= timeOut) Then
Return PING_ERROR
End If
Loop While (True)
End Function
End Class
' The MCheckSum module contains the static Calculate method.
Module MCheckSum
<StructLayout(LayoutKind.E xplicit)> _
Structure UNION_INT16
<FieldOffset(0)> Dim lsb As Byte ' Least significant byte
<FieldOffset(1)> Dim msb As Byte ' Most significant byte
<FieldOffset(0)> Dim w16 As Short
End Structure
<StructLayout(LayoutKind.E xplicit)> _
Structure UNION_INT32
<FieldOffset(0)> Dim lsw As UNION_INT16 ' Most significant word
<FieldOffset(2)> Dim msw As UNION_INT16 ' Least significant word
<FieldOffset(0)> Dim w32 As Integer
End Structure
' The Calculate method calculates the checksum value.
Public Function Calculate(ByRef buffer() As UInt16, ByVal size As Int32) As UInt16
Dim counter As Int32 = 0
Dim cksum32 As UNION_INT32
Do While (size > 0)
cksum32.w32 += Convert.ToInt32(buffer(cou nter))
counter += 1
size -= 1
Loop
cksum32.w32 = cksum32.msw.w16 + cksum32.lsw.w16 + cksum32.msw.w16
Return Convert.ToUInt16(cksum32.l sw.w16 Xor &HFFFF)
End Function
End Module
End Namespace
I use it like this:
Dim Packet As New ICMP_Packet.CPing
Dim oops as boolean
oops = False
Packet.HostName = RemotePC
If Packet.Open Then
' Establish a socket connection, and then send a packet by using ICMP.
retValue = Packet.Ping
If retValue < 0 Then
oops = True
msgbox(RemotePC & ": Host Unreachable")
End If
Packet.Close()
Else
oops = True
msgbox(RemotePC & ": Host Unknown")
End If
--------------------------
Imports System.Net.Sockets
Imports System.Net
Imports System
Imports System.Runtime.InteropServ
Namespace ICMP_Packet
' Define the structure of an ICMP packet.
' This structure contains packet information.
Structure IcmpPacket
Dim type_message As Byte ' type of message
Dim subCode_type As Byte ' type of sub-code
Dim complement_checkSum As UInt16 ' one's complement checksum for the structure
Dim identifier As UInt16 ' identifier
Dim sequenceNumber As UInt16 ' sequence number
Dim data() As Byte ' data
Public Sub Initialize(ByVal type As Byte, ByVal subCode As Byte, ByVal payload() As Byte)
Dim index As Integer
Dim buffer_icmpPacket() As Byte
Dim cksumBuffer() As UInt16
Dim icmpHeaderBufferIndex As Int32 = 0
Me.type_message = type
Me.subCode_type = subCode
complement_checkSum = UInt16.Parse("0")
identifier = UInt16.Parse("45")
sequenceNumber = UInt16.Parse("0")
data = payload
' Declare a variable to store the total packet size.
' Call the Serialize method to count the total number of bytes in the packet.
buffer_icmpPacket = Serialize()
' Resize a UInt16 array to half the size of the packet.
ReDim cksumBuffer((buffer_icmpPa
' Initialize the UInt16 array.
For index = 0 To (cksumBuffer.Length() - 1)
cksumBuffer(index) = BitConverter.ToUInt16(buff
icmpHeaderBufferIndex += 2
Next index
'Call a method that returns a checksum.
complement_checkSum = MCheckSum.Calculate(cksumB
End Sub
Public Function Size() As Integer
Return (8 + data.Length())
End Function
' The Serialize method converts the packet to a byte array to calculate the total size.
Public Function Serialize() As Byte()
Dim b_seq() As Byte = BitConverter.GetBytes(sequ
Dim b_cksum() As Byte = BitConverter.GetBytes(comp
Dim b_id() As Byte = BitConverter.GetBytes(iden
Dim index As Int32 = 0
Dim buffer() As Byte
ReDim buffer(Size() - 1)
' Serialize the structure into the array.
buffer(0) = type_message
buffer(1) = subCode_type
index += 2
Array.Copy(b_cksum, 0, buffer, index, 2)
index += 2
Array.Copy(b_id, 0, buffer, index, 2)
index += 2
Array.Copy(b_seq, 0, buffer, index, 2)
index += 2
' Copy the data.
If (data.Length() > 0) Then
Array.Copy(data, 0, buffer, index, data.Length())
End If
Return buffer
End Function
End Structure
' The CPing class.
Public Class CPing
Private Const DEFAULT_TIMEOUT As Integer = 1000
Private Const SOCKET_ERROR As Integer = -1
Private Const PING_ERROR As Integer = -1
Private Const ICMP_ECHO As Integer = 8
Private Const DATA_SIZE As Integer = 32
Private Const RECV_SIZE As Integer = 128
Private _open As Boolean = False
Private _initialized As Boolean
Private _recvBuffer() As Byte
Private _packet As IcmpPacket
Private _hostName As String
Private _server As EndPoint
Private _local As EndPoint
Private _socket As Socket
Public Sub New(ByVal hostName As String)
Me.HostName() = hostName
ReDim _recvBuffer(RECV_SIZE - 1)
End Sub
Public Sub New()
' Set the default host name to the local host.
Me.HostName() = Dns.GetHostName()
ReDim _recvBuffer(RECV_SIZE - 1)
End Sub
Private Overloads Sub finalize()
' Ensure that you close the socket.
Me.Close()
Erase _recvBuffer
End Sub
' Get and set the current host name.
Public Property HostName() As String
Get
Return _hostName
End Get
Set(ByVal Value As String)
_hostName = Value
' If the CPing object is already open, close it and then reopen it by using a new host name.
If (_open) Then
Me.Close()
Me.Open()
End If
End Set
End Property
' Get the state (open or closed).
Public ReadOnly Property IsOpen() As Boolean
Get
Return _open
End Get
End Property
' Create a socket to host remote end points and local end points.
Public Function Open() As Boolean
Dim payload() As Byte
If (Not _open) Then
Try
' Initialize the packet.
ReDim payload(DATA_SIZE)
_packet.Initialize(ICMP_EC
' Initialize an ICMP socket.
_socket = New Socket(AddressFamily.Inter
' Set the server end point.
If _hostName.ToLower.IndexOfA
_server = New IPEndPoint(Dns.GetHostByNa
Else
_server = New IPEndPoint(IPAddress.Parse
End If
' Set the receiving end point as your client computer.
_local = New IPEndPoint(Dns.GetHostByNa
_open = True
Catch
Return False
End Try
End If
Return True
End Function
' Destroy the socket and end points (if necessary).
Public Function Close() As Boolean
If (_open) Then
_socket.Close()
_socket = Nothing
_server = Nothing
_local = Nothing
_open = False
End If
Return True
End Function
' Perform a PING operation.
Public Overloads Function Ping() As Integer
Return Ping(DEFAULT_TIMEOUT)
End Function
' The Ping method performs a PING operation.
Public Overloads Function Ping(ByVal timeOutMilliSeconds As Integer) As Integer
' Initialize the time-out value.
Dim timeOut As Integer = timeOutMilliSeconds + Environment.TickCount()
' Send the packet.
Try
If (SOCKET_ERROR = _socket.SendTo(_packet.Ser
Return PING_ERROR
End If
Catch
Return PING_ERROR
End Try
' Use the following loop to check the response time until you receive a time-out.
Do
' Poll the read buffer every millisecond.
' If data exists, read the data and return the round-trip time.
If (_socket.Poll(1000, SelectMode.SelectRead)) Then
_socket.ReceiveFrom(_recvB
Return (timeOutMilliSeconds - (timeOut - Environment.TickCount()))
ElseIf (Environment.TickCount() >= timeOut) Then
Return PING_ERROR
End If
Loop While (True)
End Function
End Class
' The MCheckSum module contains the static Calculate method.
Module MCheckSum
<StructLayout(LayoutKind.E
Structure UNION_INT16
<FieldOffset(0)> Dim lsb As Byte ' Least significant byte
<FieldOffset(1)> Dim msb As Byte ' Most significant byte
<FieldOffset(0)> Dim w16 As Short
End Structure
<StructLayout(LayoutKind.E
Structure UNION_INT32
<FieldOffset(0)> Dim lsw As UNION_INT16 ' Most significant word
<FieldOffset(2)> Dim msw As UNION_INT16 ' Least significant word
<FieldOffset(0)> Dim w32 As Integer
End Structure
' The Calculate method calculates the checksum value.
Public Function Calculate(ByRef buffer() As UInt16, ByVal size As Int32) As UInt16
Dim counter As Int32 = 0
Dim cksum32 As UNION_INT32
Do While (size > 0)
cksum32.w32 += Convert.ToInt32(buffer(cou
counter += 1
size -= 1
Loop
cksum32.w32 = cksum32.msw.w16 + cksum32.lsw.w16 + cksum32.msw.w16
Return Convert.ToUInt16(cksum32.l
End Function
End Module
End Namespace
ASKER
I tried using your code. I copied the namespace thing in a different class and used the above code to ping the dns servers.
but even when the DNS servers are reachable it says"host unreachable". i tried changing this Unreachable to Reachable thinking it is a typo. But this didnt serve my purpose. i entered some random ip address, and it said host reachable.
is the logic correct ?
thanks..... waiting for your help.
but even when the DNS servers are reachable it says"host unreachable". i tried changing this Unreachable to Reachable thinking it is a typo. But this didnt serve my purpose. i entered some random ip address, and it said host reachable.
is the logic correct ?
thanks..... waiting for your help.
That's odd... I copied that right out of a program that I wrote. So, unless the "copy and paste" failed somehow, I'd think the code was correct as is.
A successful ping (using the code snipet posted above) doesn't return anything at all...
A successful ping (using the code snipet posted above) doesn't return anything at all...
ASKER
Thanx!!
ASKER
Is there any way to test the DNS servers detected, I mean a sort of ping to validate the detected DNS servers.
Thanks.