26.5 DHCP检测过程
本章节配套的程序中对DHCP检测过程做了一个简单的判断,8秒内不能获得动态IP地址的话,将使用配置向导文件Net_Config.c里面设置的固定IP地址:192.168.1.100。
检测代码如下:
/*
**********************************************************************************************************
外部调用
**********************************************************************************************************
*/
#define DHCP_TOUT 80 /* DHCP动态IP获取的溢出时间设置为8秒 */
#define MY_IP localm[NETIF_ETH].IpAdr
extern LOCALM localm[];
/*
**********************************************************************************************************
变量
**********************************************************************************************************
*/
uint32_t dhcp_tout;
uint8_t DHCP_Status[2][40] = {"IP: 192.168.X.X",
"Waiting for DHCP"};
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: 标准c程序入口。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void dhcp_check(void)
{
/* 检测是否通过DHCP自动获得IP */
if (mem_test (&MY_IP, 0, IP_ADRLEN) == __FALSE && !(dhcp_tout & 0x80000000))
{
/* 已经获得IP */
dhcp_tout = 0;
sprintf((char *)DHCP_Status[0],"%d.%d.%d.%d", MY_IP[0], MY_IP[1],
MY_IP[2], MY_IP[3]);
sprintf((char *)DHCP_Status[1],"DHCP Success");
printf_tcpdbg("%srn", DHCP_Status[0]);
printf_tcpdbg("%srn", DHCP_Status[1]);
return;
}
/* 每100ms进行一次减减操作 */
if (--dhcp_tout == 0)
{
/* 设置的8秒自动获取IP时间已经到了,禁止DHCP,准备使用固定IP */
dhcp_disable ();
sprintf((char *)DHCP_Status[1],"DHCP Failed" );
/* 更新溢出时间,将固定IP的分配时间也设置为8秒 */
dhcp_tout = 80 | 0x80000000;
return;
}
/* 设置固定IP的8秒时间到 */
if (dhcp_tout == 0x80000000)
{
dhcp_tout = 0;
sprintf((char *)DHCP_Status[0],"%d.%d.%d.%d", MY_IP[0], MY_IP[1],
MY_IP[2], MY_IP[3]);
sprintf((char *)DHCP_Status[1],"DHCP Failed Use static IP");
printf_tcpdbg("%srn", DHCP_Status[0]);
printf_tcpdbg("%srn", DHCP_Status[1]);
}
}
/*
*********************************************************************************************************
* 函 数 名: TCPnetTest
* 功能说明: 主要实现动态IP获取和网络协议栈主函数main_TcpNet的调用。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void TCPnetTest(void)
{
uint32_t tstart, tend;
/* 初始化变量 */
dhcp_tout = DHCP_TOUT;
tstart = os_time_get();
while (1)
{
/* 每100ms做一次DHCP检测 */
if(dhcp_tout != 0)
{
tend = os_time_get() - tstart;
//printf_tcpdbg("%x %drn", dhcp_tout, tend);
if(tend >= 100)
{
tstart = os_time_get();
dhcp_check();
}
}
os_evt_wait_and(0x0001, 0xFFFF);
while (main_TcpNet() == __TRUE);
}
} |