440 lines
16 KiB
VB.net
440 lines
16 KiB
VB.net
Imports System.Management
|
||
Imports System.Net
|
||
Imports System.Net.NetworkInformation
|
||
Imports System.Net.Sockets
|
||
Imports System.Text
|
||
Imports ARSoft.Tools.Net.Dns
|
||
Imports DotNetProjects.DhcpServer
|
||
Imports DotNetProjects.DhcpServer.DHCPRequest
|
||
|
||
Public Class DhcpServer
|
||
Public Event OupPrintfDHCPlog(IPadd As String, mac As String, msgtype As Integer)
|
||
Public Event IsOpenwifi(Iswifi As Boolean)
|
||
Enum IPStateType
|
||
NotAllocated = 1 ' 未分配
|
||
Assigned ' 待分配
|
||
TakeUp ' 占用
|
||
Overdue ' 过期
|
||
End Enum
|
||
Public test As DotNetProjects.DhcpServer.DHCPServer
|
||
Public _IndexIPDic As Dictionary(Of String, dhcpInfo)
|
||
|
||
|
||
Sub New(Optional IPPoolMax As Integer = 10)
|
||
_IndexIPDic = New Dictionary(Of String, dhcpInfo)
|
||
sendReply = New DHCPReplyOptions
|
||
iscnt = False
|
||
isnumber = 0
|
||
'GetMACAddress()
|
||
init(IPPoolMax)
|
||
End Sub
|
||
|
||
Public Sub init(Optional IPPoolMax As Integer = 10)
|
||
Dim isNetworkInterfaces As NetworkInterface() = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
|
||
Dim ipProperties As IPInterfaceProperties
|
||
Dim gateways As UnicastIPAddressInformationCollection
|
||
Dim loadip As IPAddress = IPAddress.Parse("192.168.1.10")
|
||
Dim mac As String = String.Empty
|
||
For Each inten In isNetworkInterfaces
|
||
If inten.NetworkInterfaceType = NetworkInterfaceType.Ethernet Then
|
||
'SetIPAddress({192, 168, 1, 10}, {255, 255, 255, 0}, {192, 168, 1, 1}, {8, 8, 8, 8}, inten)
|
||
'SetManagementBaseObject(inten)
|
||
ipProperties = inten.GetIPProperties
|
||
gateways = ipProperties.UnicastAddresses
|
||
For Each tmp In gateways
|
||
If tmp.Address.AddressFamily = AddressFamily.InterNetwork Then
|
||
'loadip = tmp.Address
|
||
mac = inten.GetPhysicalAddress.ToString
|
||
End If
|
||
Next
|
||
test = New DotNetProjects.DhcpServer.DHCPServer(loadip)
|
||
test.SendDhcpAnswerNetworkInterface = inten
|
||
test.BroadcastAddress = IPAddress.Parse("255.255.255.255")
|
||
SetsendReply(loadip.ToString)
|
||
InitIPPool(loadip.ToString, IPPoolMax, mac)
|
||
Try
|
||
DHCPRuning()
|
||
Catch ex As Exception
|
||
'MsgBox($"{loadip.ToString }_{inten.Name }{ex}")
|
||
init(IPPoolMax)
|
||
End Try
|
||
|
||
Exit For
|
||
End If
|
||
Next
|
||
|
||
End Sub
|
||
|
||
|
||
|
||
Public Function GetMACAddress() As String
|
||
Dim mac As String = String.Empty
|
||
For Each nic In NetworkInterface.GetAllNetworkInterfaces
|
||
Console.WriteLine(nic.GetPhysicalAddress.ToString)
|
||
Next
|
||
|
||
End Function
|
||
|
||
|
||
Public Sub DHCPRuning()
|
||
|
||
'InitIPPool(inten.GetIPProperties, IPPoolMax)
|
||
AddHandler test.OnDataReceived, AddressOf UserDHCPDataReceivedEventHandler
|
||
AddHandler test.OnDiscover, AddressOf UserDHCPDataReceivedEventHandler
|
||
AddHandler test.OnRequest, AddressOf UserDHCPDataReceivedEventHandler
|
||
AddHandler test.OnDecline, AddressOf UserDHCPDataReceivedEventHandler
|
||
AddHandler test.OnReleased, AddressOf UserDHCPDataReceivedEventHandler
|
||
AddHandler test.OnInform, AddressOf UserDHCPDataReceivedEventHandler
|
||
test.Start()
|
||
|
||
End Sub
|
||
Public Sub SetsendReply(txt_LoadIP As String)
|
||
sendReply.SubnetMask = IPAddress.Parse("255.255.0.0")
|
||
sendReply.ServerIpAddress = IPAddress.Parse(txt_LoadIP) '本机电脑iP
|
||
sendReply.IPAddressLeaseTime = 86400
|
||
sendReply.RenewalTimeValue_T1 = 86400
|
||
sendReply.RebindingTimeValue_T2 = 86400
|
||
sendReply.DomainName = "demo.pi"
|
||
sendReply.ServerIdentifier = IPAddress.Parse(txt_LoadIP) '本机电脑iP
|
||
sendReply.RouterIP = IPAddress.Parse("192.168.1.1")
|
||
sendReply.DomainNameServers = GetDomainNameServers("8.8.8.8,8.4.4.4")
|
||
'sendReply.LogServerIP = IPAddress.Parse(options_120.Text)
|
||
IPfile = "/pxelinux.0"
|
||
End Sub
|
||
|
||
|
||
|
||
|
||
Public Function GetDomainNameServers(theip As String) As IPAddress()
|
||
Dim ipstr2() As String = theip.Split(",")
|
||
Dim result As New List(Of IPAddress)
|
||
For Each index2 In ipstr2
|
||
result.Add(IPAddress.Parse(index2))
|
||
Next
|
||
Return result.ToArray
|
||
|
||
End Function
|
||
|
||
|
||
Public Function SetManagementBaseObject(isNetworkInterfaces As NetworkInterface) As ManagementBaseObject
|
||
Dim mos As ManagementObjectSearcher = New ManagementObjectSearcher("select * from Win32_NetworkAdapterConfiguration")
|
||
For Each mo As ManagementObject In mos.Get()
|
||
If mo("Description").ToString().Equals(isNetworkInterfaces.Description) Then
|
||
Dim newIP As ManagementBaseObject = mo.GetMethodParameters("EnableStatic")
|
||
Dim newGateway As ManagementBaseObject = mo.GetMethodParameters("SetGateways")
|
||
Dim newDNS As ManagementBaseObject = mo.GetMethodParameters("SetDNSServerSearchOrder")
|
||
newIP.Item("IPAddress") = New String() {192, 168, 1, 10}
|
||
newIP.Item("SubnetMask") = New String() {255, 255, 255, 0}
|
||
newGateway.Item("DefaultIPGateway") = New String() {192, 168, 1, 1}
|
||
' newDNS.Item("DNSServerSearchOrder") = New String[] { info.DNS };
|
||
Dim setIP As ManagementBaseObject = mo.InvokeMethod("EnableStatic", newIP, Nothing)
|
||
Dim setGateways As ManagementBaseObject = mo.InvokeMethod("SetGateways", newGateway, Nothing)
|
||
Dim setDNS As ManagementBaseObject = mo.InvokeMethod("SetDNSServerSearchOrder", newDNS, Nothing)
|
||
'mo.InvokeMethod("SetDNSServerSearchOrder", Nothing);
|
||
'//DNS的地址清
|
||
' mo.InvokeMethod("EnableDHCP", Nothing)
|
||
'//开启DHCP
|
||
End If
|
||
Next
|
||
|
||
End Function
|
||
|
||
|
||
|
||
Public Shared Sub SetIPAddress(ByVal ip As String(), ByVal submask As String(), ByVal getway As String(), ByVal dns As String(), isNetworkInterfaces As NetworkInterface)
|
||
Dim wmi As ManagementClass = New ManagementClass("Win32_NetworkAdapterConfiguration")
|
||
Dim moc As ManagementObjectCollection = wmi.GetInstances()
|
||
Dim inPar As ManagementBaseObject = Nothing
|
||
Dim outPar As ManagementBaseObject = Nothing
|
||
|
||
For Each mo As ManagementObject In moc
|
||
'/如果没有启用IP设置的网络设备则跳过
|
||
Console.WriteLine($"{mo("Description").ToString()}")
|
||
If Not mo("Description").ToString().Equals(isNetworkInterfaces.Description) Then Continue For
|
||
' 设置IP地址和掩码
|
||
If ip IsNot Nothing AndAlso submask IsNot Nothing Then
|
||
inPar = mo.GetMethodParameters("EnableStatic")
|
||
inPar("IPAddress") = ip
|
||
inPar("SubnetMask") = submask
|
||
outPar = mo.InvokeMethod("EnableStatic", inPar, Nothing)
|
||
End If
|
||
' //设置网关地址
|
||
If getway IsNot Nothing Then
|
||
inPar = mo.GetMethodParameters("SetGateways")
|
||
inPar("DefaultIPGateway") = getway
|
||
outPar = mo.InvokeMethod("SetGateways", inPar, Nothing)
|
||
End If
|
||
' //设置DNS地址
|
||
If dns IsNot Nothing Then
|
||
inPar = mo.GetMethodParameters("SetDNSServerSearchOrder")
|
||
inPar("DNSServerSearchOrder") = dns
|
||
outPar = mo.InvokeMethod("SetDNSServerSearchOrder", inPar, Nothing)
|
||
End If
|
||
Next
|
||
End Sub
|
||
|
||
Public Sub ClockDHCPServer()
|
||
If IsNothing(test) Then Return
|
||
test.BroadcastAddress = IPAddress.Parse("0.0.0.0")
|
||
test.Dispose()
|
||
' test.BroadcastAddress = IPAddress.Parse("0.0.0.0")
|
||
End Sub
|
||
|
||
Public Sub UserDHCPDataReceivedEventHandler(dhcpRequest As DHCPRequest)
|
||
AnalytischeGegevens(dhcpRequest) ' dhcpRequest.SendDHCPReply(,,)
|
||
End Sub
|
||
Public iscnt As Boolean
|
||
Public isnumber As Integer
|
||
Public Sub AnalytischeGegevens(dhcpRequest As DHCPRequest)
|
||
|
||
Select Case dhcpRequest.GetMsgType
|
||
|
||
Case DHCPMsgType.DHCPACK
|
||
|
||
Case DHCPMsgType.DHCPDECLINE
|
||
|
||
Case DHCPMsgType.DHCPDISCOVER '上线
|
||
|
||
'Dim ipinfo As NetworkInterface = test.SendDhcpAnswerNetworkInterface
|
||
'If iscnt Then
|
||
' RaiseEvent IsOpenwifi(False)
|
||
' iscnt = False
|
||
'End If
|
||
|
||
|
||
|
||
Dhcp_OFFER(dhcpRequest)
|
||
Case DHCPMsgType.DHCPINFORM
|
||
|
||
Case DHCPMsgType.DHCPNAK
|
||
|
||
Case DHCPMsgType.DHCPOFFER
|
||
|
||
Case DHCPMsgType.DHCPRELEASE '下线
|
||
|
||
Case DHCPMsgType.DHCPREQUEST
|
||
|
||
Dhcp_ACK(dhcpRequest)
|
||
|
||
End Select
|
||
|
||
|
||
End Sub
|
||
Public Function GetByteIPToString(buff() As Byte) As String
|
||
Dim result As String = ""
|
||
For Each index In buff
|
||
result = result & index & "."
|
||
Next
|
||
result = result.Substring(0, result.Length - 1)
|
||
|
||
Return result
|
||
End Function
|
||
Public Sub InitIPPool(startIP As String, ipMax As Integer, mac As String)
|
||
Dim ipstrbuff() As String
|
||
Dim number As Integer = 0
|
||
ipstrbuff = startIP.Split(".")
|
||
Dim cip As String = ""
|
||
Dim ClientIP(3) As Byte
|
||
_IndexIPDic.Clear()
|
||
|
||
For i = 0 To 3
|
||
|
||
Integer.TryParse(ipstrbuff(i), number)
|
||
ClientIP(i) = number
|
||
If i < 3 Then
|
||
cip = cip & ClientIP(i) & "."
|
||
End If
|
||
|
||
|
||
Next
|
||
If Not _IndexIPDic.ContainsKey(startIP) Then
|
||
Dim newinfo As New dhcpInfo(ClientIP)
|
||
newinfo.ChildState = IPStateType.Assigned
|
||
newinfo.ChildMac = GetMacStr(mac)
|
||
_IndexIPDic.Add(startIP, newinfo)
|
||
|
||
End If
|
||
|
||
For i As Integer = 1 To ipMax
|
||
If ClientIP(3) + i > 255 Then Return
|
||
Dim nClientIP(3) As Byte
|
||
Array.Copy(ClientIP, nClientIP, ClientIP.Length)
|
||
nClientIP(3) = ClientIP(3) + i
|
||
If _IndexIPDic.ContainsKey(cip & nClientIP(3).ToString) Then Continue For
|
||
_IndexIPDic.Add(cip & nClientIP(3).ToString, New dhcpInfo(nClientIP))
|
||
Next
|
||
|
||
End Sub
|
||
Public sendReply As DHCPReplyOptions
|
||
Public IPfile As String
|
||
Public Sub Dhcp_ACK(dhcpRequest As DHCPRequest)
|
||
|
||
|
||
Dim sda As DHCPPacket = dhcpRequest.GetRawPacket
|
||
Dim RequestedIP As IPAddress = dhcpRequest.GetRequestedIP
|
||
Dim cmac As String = GetMacStr(sda.chaddr)
|
||
Dim newinfo As dhcpInfo = CheckIsTakeUp(RequestedIP.ToString, cmac)
|
||
|
||
|
||
Try
|
||
If IsNothing(newinfo) Then
|
||
dhcpRequest.SendDHCPReply(DHCPMsgType.DHCPNAK, IPAddress.Any, sendReply)
|
||
RaiseEvent OupPrintfDHCPlog(RequestedIP.ToString, cmac, 4)
|
||
Return
|
||
End If
|
||
Catch ex As Exception
|
||
Return
|
||
End Try
|
||
|
||
|
||
Dim IPstr As String = GetByteIPToString(newinfo.ChilIP)
|
||
Dim ip As IPAddress = IPAddress.Parse(IPstr)
|
||
|
||
sda.op = &H2
|
||
sda.htype = &H1
|
||
sda.hlen = &H6
|
||
sda.hops = &H0
|
||
sda.flags = {&H0, &H1}
|
||
sda.giaddr = {&H0, &H0, &H0, &H0}
|
||
sda.yiaddr = newinfo.ChilIP
|
||
sda.siaddr = newinfo.ChilIP
|
||
Dim filebuff() As Byte = Encoding.UTF8.GetBytes(IPfile)
|
||
|
||
Array.Copy(filebuff, sda.file, filebuff.Length)
|
||
|
||
Try
|
||
RaiseEvent OupPrintfDHCPlog(IPstr, cmac, 5)
|
||
dhcpRequest.SendDHCPReply(DHCPMsgType.DHCPACK, ip, sendReply)
|
||
Catch ex As Exception
|
||
Console.WriteLine("发送异常:" & ex.ToString)
|
||
End Try
|
||
|
||
End Sub
|
||
Public Sub Dhcp_OFFER(dhcpRequest As DHCPRequest)
|
||
|
||
Dim sda As DHCPPacket = dhcpRequest.GetRawPacket
|
||
Dim cmac As String = GetMacStr(sda.chaddr)
|
||
RaiseEvent OupPrintfDHCPlog("", cmac, 1)
|
||
Dim newinfo As dhcpInfo = GetNewIPInfo(cmac)
|
||
Dim dic As New Dictionary(Of DHCPOption, Byte())
|
||
dic.Add(DHCPOption.NetBIOSoverTCPIPNameServer, {8, 8, 8, 8})
|
||
dic.Add(DHCPOption.NetworkTimeProtocolServers, {&H58, &HBF, &HE4, &H8A})
|
||
dic.Add(DHCPOption.TFTPServerName, {&H31, &H39, &H32, &H2E, &H31, &H36, &H38, &H2E, &H31, &H2E, &H31, &H30})
|
||
dic.Add(DHCPOption.DomainName, {&H64, &H65, &H6D, &H6F, &H2E, &H70, &H69})
|
||
dic.Add(DHCPOption.StaticRoutes, {&H78, &H30, &H42, &H41, &H43, &H31, &H30, &H43, &H30, &H41, &H38, &H30, &H31, &H46, &H45})
|
||
sendReply.OtherRequestedOptions = dic
|
||
If IsNothing(newinfo) Then
|
||
dhcpRequest.SendDHCPReply(DHCPMsgType.DHCPNAK, IPAddress.Any, sendReply)
|
||
RaiseEvent OupPrintfDHCPlog("", cmac, 2)
|
||
Return
|
||
End If
|
||
|
||
'Dim IPstr As String = GetByteIPToString(newinfo.ChilIP)
|
||
'Dim ip As IPAddress = IPAddress.Parse(IPstr)
|
||
Dim IPstr As String = GetByteIPToString(newinfo.ChilIP)
|
||
Dim ip As IPAddress = IPAddress.Parse(IPstr)
|
||
|
||
|
||
|
||
newinfo.ChildMac = cmac
|
||
|
||
newinfo.ChildState = IPStateType.Assigned
|
||
|
||
sda.op = &H2
|
||
sda.htype = &H1
|
||
sda.hlen = &H6
|
||
sda.hops = &H0
|
||
sda.flags = {&H0, &H1}
|
||
sda.giaddr = {&H0, &H0, &H0, &H0}
|
||
sda.yiaddr = newinfo.ChilIP
|
||
sda.siaddr = newinfo.ChilIP
|
||
|
||
Dim filebuff() As Byte = Encoding.UTF8.GetBytes(IPfile)
|
||
|
||
Array.Copy(filebuff, sda.file, filebuff.Length)
|
||
|
||
Try
|
||
dhcpRequest.SendDHCPReply(DHCPMsgType.DHCPOFFER, ip, sendReply, dic)
|
||
RaiseEvent OupPrintfDHCPlog(IPstr, cmac, 3)
|
||
Catch ex As Exception
|
||
Console.WriteLine("发送异常:" & ex.ToString)
|
||
End Try
|
||
|
||
End Sub
|
||
Public Function GetMacStr(duff As String) As String
|
||
Dim sresult As String = ""
|
||
For i As Integer = 0 To 5
|
||
sresult = sresult & duff.Substring(i * 2, 2) & ":"
|
||
|
||
Next
|
||
Return sresult.Substring(0, sresult.Length - 1)
|
||
End Function
|
||
Public Function GetMacStr(duff() As Byte) As String
|
||
Dim sresult As String = ""
|
||
Dim locadMac(5) As Byte
|
||
Array.Copy(duff, locadMac, locadMac.Length)
|
||
For Each index In locadMac
|
||
sresult = sresult & Hex(index) & ":"
|
||
Next
|
||
Return sresult.Substring(0, sresult.Length - 1)
|
||
End Function
|
||
|
||
Public Function GetNewIPInfo(mac As String) As dhcpInfo
|
||
Dim newdhcpInfo As dhcpInfo
|
||
Dim olddhcpInfo As dhcpInfo
|
||
|
||
|
||
For Each index In _IndexIPDic.Values
|
||
If mac.Equals(index.ChildMac) Then Return index
|
||
If IsNothing(newdhcpInfo) AndAlso index.ChildState = IPStateType.NotAllocated Then
|
||
newdhcpInfo = index
|
||
Exit For
|
||
End If
|
||
If IsNothing(olddhcpInfo) AndAlso index.ChildState = IPStateType.Overdue Then
|
||
olddhcpInfo = index
|
||
End If
|
||
Next
|
||
If Not IsNothing(newdhcpInfo) Then
|
||
Return newdhcpInfo
|
||
ElseIf Not IsNothing(olddhcpInfo) Then
|
||
Return olddhcpInfo
|
||
Else
|
||
Return Nothing
|
||
End If
|
||
|
||
End Function
|
||
|
||
Public Function CheckIsTakeUp(name As String, mac As String) As dhcpInfo
|
||
|
||
If _IndexIPDic.ContainsKey(name) Then
|
||
Dim Index = _IndexIPDic.Item(name)
|
||
'ip 被占用 且用户 Mac 地址一致
|
||
If Index.ChildState <> IPStateType.NotAllocated AndAlso Index.ChildMac.Equals(mac) Then
|
||
Index.ChildState = IPStateType.Assigned
|
||
Return Index
|
||
Else
|
||
Return Nothing
|
||
End If
|
||
End If
|
||
Return Nothing
|
||
End Function
|
||
|
||
End Class
|
||
Public Class dhcpInfo
|
||
Public ChilIP() As Byte
|
||
|
||
Public ChildMac As String = ""
|
||
|
||
Public ChildTime As Long = 0
|
||
|
||
Public ChildState As Integer = 1
|
||
Sub New(ip() As Byte)
|
||
ChilIP = ip
|
||
ChildMac = ""
|
||
ChildTime = 0
|
||
ChildState = 1
|
||
|
||
|
||
End Sub
|
||
|
||
End Class |