private void HandleResponse(byte[] buffer) { if (buffer[0Xf0 + 42] == 0x35 && buffer[0xf2 + 42] == 0x2) // Offer { m_IStatusUpdate.UpdateStatus("Received DHCP Offer"); GetOfferData(ref buffer); SendRequest(); } else if (buffer[0Xf0 + 42] == 0x35 && buffer[0xf2 + 42] == 0x5) // ACK { string strIP = IPToString(m_dwRequestedIP); string strSubnetMask = IPToString(m_dwSubnetMask); m_IStatusUpdate.UpdateStatus("Received DHCP ACK with IP " + strIP); NetworkManagement networkMgmt = new NetworkManagement(); if (networkMgmt.setIP(MAC, strIP, strSubnetMask)) { m_IStatusUpdate.UpdateStatus("Set network card IP to " + strIP); } else { m_IStatusUpdate.UpdateStatus("Failed to change network card IP"); } m_State = DHCPState.BOUND; } }
public void Connect(IStatusUpdate IStatusUpdate) { m_State = DHCPState.INIT; m_bStop = false; m_IStatusUpdate = IStatusUpdate; m_Instance = this; m_Device = null; m_dtBound = DateTime.MaxValue; m_FilterThread = new Thread(new ThreadStart(StartFilter)); m_FilterThread.Start(); m_TimerThread = new Thread(new ThreadStart(TimerHandler)); m_TimerThread.Start(); }
private void TimerHandler() { DHCPState previousState = m_State; while (!m_bStop) { switch (m_State) { case DHCPState.INIT: previousState = DHCPState.INIT; SendDiscover(); break; case DHCPState.DISCOVER: m_State = DHCPState.INIT; previousState = DHCPState.DISCOVER; break; case DHCPState.BOUND: if (previousState != m_State) { previousState = DHCPState.BOUND; byte[] temp = BitConverter.GetBytes(m_dwLeaseTime); Array.Reverse(temp); int dwLeaseTime = BitConverter.ToInt32(temp, 0); m_spanLease = new TimeSpan(0, 0, dwLeaseTime / 2); m_dtBound = DateTime.Now; } if (DateTime.Now.Subtract(m_dtBound) > m_spanLease) { m_State = DHCPState.INIT; } break; default: break; } Thread.Sleep(5000); } }