用c#编写一个dhcp服务

一、DHCP是什么?
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。
说白了,每台网络设备想要上网必须要有ip地址,但是现在的互联网ip4地址资源有限,无法让这么多的设备没人一个互联网地址,于是路由器就出现了,路由器的作用就是将局域网的数据包转发到广域网上,使局域网内机器也能访问互联网,局域网可使用的网段(私网地址段)有三大段:
10.0.0.0~10.255.255.255(A类)
172.16.0.0~172.31.255.255(B类)
192.168.0.0~192.168.255.255(C类)
机器地址的获取可以通过dhcp进行分配,以免出现同一个地址被多台设备使用的情况

那么今天我们来用c#实现一个小型的dhcp服务器
二、c#编写dhcp

客户机与dhcp服务器之间的报文交换可以看上图
1、客户机发送dhcp discovery报文
2、dhcp接收到报文后发送dhcp offer报文
3、客户机收到后发送请求报文
4、dhcp发送确认报文(包含分配的ip地址)
5、客户机如果释放ip地址也会发送一个释放报文给dhcp
dhcp默认使用UDP进行报文传输,报文的格式如下

下面我来用c#编写一个dhcp服务器
原理很简单,就是创建一个UDPclient,监听67,68端口,进行报文的发送与接收
#region Copyright Information
/*
* (C) 2005-2007, Marcello Cauchi Savona
*
* For terms and usage, please see the LICENSE file
* provided alongwith or contact marcello_c@hotmail.com
* http://www.cheekyneedle.com
*
*
*/
#endregion
/*
* clsUDP
* shall start a listner, and raise an event every time data arrives on a port
* shall also be able to send data via udp protocol
* .Dispose shall remove all resources associated with the class
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using Microsoft.Win32;
namespace SmallDHCPServer_C
{
class clsUDP
{
#region "Class Variables"
private Int32 PortToListenTo, PortToSendTo = 0;
private string rcvCardIP;
public bool IsListening;
// call backs for send/recieve!
public UdpState s;
#endregion
#region "Class Events"
public delegate void DataRcvdEventHandler(byte[] DData, IPEndPoint RIpEndPoint);
public event DataRcvdEventHandler DataRcvd;
public delegate void ErrEventHandler(string Msg);
#endregion
//class constructors
public clsUDP()
{
IsListening = false;
}
//overrides pass the port to listen to/sendto and startup
public clsUDP(Int32 PortToListenTo,Int32 PortToSendTo, string rcvCardIP)
{
try
{
IsListening = false;
this.PortToListenTo = PortToListenTo;
this.PortToSendTo = PortToSendTo;
this.rcvCardIP = rcvCardIP;
StartListener();
}
catch(Exception ex)
{
Console.WriteLine (ex.Message);
}
}
//string property to contain the class ...点击查看剩余70%
网友评论0