include "DHCP.h"
#define _DHCP_C
#define THIS_IS_DHCP
#define DHCP_TIMEOUT (TICK)(2L * TICK_SECOND)
#define DHCP_CLIENT_PORT (68u)
#define DHCP_SERVER_PORT (67u)
#define BOOT_REQUEST (1u)
#define BOOT_REPLY (2u)
#define HW_TYPE (1u)
#define LEN_OF_HW_TYPE (6u)
#define DHCP_MESSAGE_TYPE (53u)
#define DHCP_MESSAGE_TYPE_LEN (1u)
#define DHCP_UNKNOWN_MESSAGE (0u)
#define DHCP_DISCOVER_MESSAGE (1u)
#define DHCP_OFFER_MESSAGE (2u)
#define DHCP_REQUEST_MESSAGE (3u)
#define DHCP_DECLINE_MESSAGE (4u)
#define DHCP_ACK_MESSAGE (5u)
#define DHCP_NAK_MESSAGE (6u)
#define DHCP_RELEASE_MESSAGE (7u)
#define DHCP_SERVER_IDENTIFIER (54u)
#define DHCP_SERVER_IDENTIFIER_LEN (4u)
#define DHCP_PARAM_REQUEST_LIST (55u)
#define DHCP_PARAM_REQUEST_LIST_LEN (2u)
#define DHCP_PARAM_REQUEST_IP_ADDRESS (50u)
#define DHCP_PARAM_REQUEST_IP_ADDRESS_LEN (4u)
#define DHCP_SUBNET_MASK (1u)
#define DHCP_ROUTER (3u)
#define DHCP_IP_LEASE_TIME (51u)
#define DHCP_END_OPTION (255u)
#define HALF_HOUR (WORD)((WORD)60 * (WORD)30)
#define INVALID_UDP_SOCKET (0xff)
#define INVALID_UDP_PORT (0L)
#define SIZE_OF_DHCPMES (548u) //标准DHCP报文字节大小
DHCP_MES DHCPMes;
APP_CONFIG AppConfig;
SM_DHCP smDHCPState = SM_DHCP_INIT;
static UDP_SOCKET DHCPSocket = INVALID_UDP_SOCKET;
DHCP_STATE DHCPState = { 0x00 };
static IP_ADDR DHCPServerID;
//static DWORD_VAL DHCPLeaseTime;
static IP_ADDR tempIPAddress;
static IP_ADDR tempGateway;
static IP_ADDR tempMask;
INT8U SizeOfOptionsUsed; //DHCP报文options字段使用的字节
INT8U SizeOfDHCPMesUsed; //DHCP报文全部字段使用字节长度
static INT8U _DHCPReceive(void);
static void _DHCPSend(INT8U messageType);
/*
*********************************************************************************************************
* DHCPReset
*
* Description: 对DHCP进行重置,设置相应的参数
*
* Arguments : void
*
* Returns : void
*
* Notes : 当服务器发回NAC报文时调用此函数
*
**********************************************************************************************************
*/
void DHCPReset(void)
{
// Do not reset DHCP if it was previously disabled.
if ( smDHCPState == SM_DHCP_DISABLED )
return;
if ( DHCPSocket != INVALID_UDP_SOCKET )
UDPClose(DHCPSocket); //???????????关闭套接字
DHCPSocket = INVALID_UDP_SOCKET;
smDHCPState = SM_DHCP_INIT;
// DHCPBindCount = 0;
DHCPState.bits.bIsBound = FALSE;
}
/*
*********************************************************************************************************
* DHCP_MesInit
*
* Description: DHCP报文初始化函数:对除了options字段外其他部分进行初始化,供DHCP_Send函数进行调用
*
* Arguments : void
*
* Returns : void
*
* Notes : 报文部分字段赋值为固定值
*
**********************************************************************************************************
*/
viod DHCP_MesInit(viod)
{
INT8U i;
DHCPMes.op=BOOT_REQUEST;
DHCPMes.htype=HW_TYPE;
DHCPMes.hlen=LEN_OF_HW_TYP
DHCP客户端实现(初稿)
最新推荐文章于 2024-08-05 15:01:26 发布
本文档初步探讨了DHCP客户端的实现,详细解析了DHCP协议的头文件,涵盖了网络通信的基础知识,如socket编程、服务器结构以及数据结构的应用。
摘要由CSDN通过智能技术生成