Простой DNS-сервер

Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Imports System.Threading
Public Class DNS
    Private Shared client As UdpClient = New UdpClient(53)
    Private Shared rP As IPEndPoint = New IPEndPoint(New IPAddress(0), 0)
    Private Shared th As Thread = New Thread(New ThreadStart(AddressOf WaitF))
    Public Shared Sub Start()
        th.Start()
    End Sub
    Public Shared Sub [Stop]()
        th.Abort()
    End Sub
    Private Shared Sub WaitF()
        While True
            On Error Resume Next
            Dim d() As Byte = client.Receive(rP)
            Dim data(d.Length - 12 - 6) As Byte
            Dim tmp As Integer = 0
            Dim tmp1 As Integer = 0
            For i As Integer = 12 To d.Length - 6
                tmp = d(i)
                If tmp = 0 Then Exit For
                For j As Integer = 0 To tmp
                    data(j + tmp1) = d(j + i + 1)
                Next
                data(tmp + tmp1) = Asc(".")
                tmp1 = tmp1 + tmp + 1
                i = i + tmp
            Next
            Dim Answer(d.Length - 1) As Byte
            Array.Copy(d, Answer, d.Length)
            Answer(2) = 133
            Answer(3) = 128
            Answer(4) = 0
            Answer(5) = 0 'zero question
            Answer(6) = 0
            Answer(7) = 1 'one answer
            ReDim Preserve Answer(Answer.Length + 4) 'Add 5 Zeroes (some flags)
            ReDim Preserve Answer(Answer.Length + 4) 'Answer: length(1)+ ip(4)
            Answer(d.Length + 5) = 4
            Dim normal As String = Encoding.ASCII.GetString(data).Substring(0, data.Length - 1)
            'Get DNS record
            Dim path() As String = normal.Split(".")
            Dim dir As String = ""
            For i As Integer = path.Length - 1 To 1 Step -1
                dir = dir & path(i) & "\"
            Next
            dir = "db\" & dir & path(0) & ".dns"
            Dim inHost() As Byte = New Byte() {0, 0, 0, 0}
            If File.Exists(dir) Then
                Dim sr As StreamReader = New StreamReader(File.OpenRead(dir), True)
                Dim tIP As String = sr.ReadLine
                sr.Close()
                inHost = New Byte() {Val(tIP.Split(".")(0)), Val(tIP.Split(".")(1)), Val(tIP.Split(".")(2)), Val(tIP.Split(".")(3))}
            Else
                Dim q As String = Resolver.Ping(normal)
                If q <> "" Then
                    Directory.CreateDirectory(dir.Substring(0, dir.IndexOf(path(0) & ".dns") - 1))
                    Dim sw As StreamWriter = New StreamWriter(File.OpenWrite(dir))
                    sw.WriteLine(q)
                    sw.Close()
                End If
            End If
            'end GET DNS record
            For i As Integer = 0 To inHost.Length - 1
                Answer(d.Length + 6 + i) = inHost(i)
            Next
            Dim h As String = rP.ToString.Substring(0, rP.ToString.IndexOf(":"))
            Dim p As Integer = CInt(rP.ToString.Substring(rP.ToString.IndexOf(":") + 1))
            client.Send(Answer, Answer.Length, h, p)
            If inHost(0) = 0 Then Console.ForegroundColor = ConsoleColor.Red Else Console.ForegroundColor = ConsoleColor.Green
            Console.WriteLine(normal & ":" & Val(inHost(0)) & "." & Val(inHost(1)) & "." & Val(inHost(2)) & "." & Val(inHost(3)))
        End While
    End Sub
End Class
Теги:
DNS, сервер
Добавлено: 05 Января 2014 05:27:22 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...