LwIP DHCP实现

can123dao 2013-07-27 09:32:34
现有一个路由,一个STM32开发板,一台PC。已实现将开发板分别或同时做为SERVER,CLIENT和PC通信,但IP地址都是通过预先配置好的。现在想在开发板做CLIENT时,使用路由做DHCP server给板子自动分配IP。分配不成功,不知道怎么回事,路由已经开启了DHCP功能。有人做过类似的能讲一下或分享一下么。

void LwIP_Init( void )
{
struct netif enc28j60;
struct ip_addr ipaddr;
struct ip_addr netmask;
struct ip_addr gw;
int i,j,cnt;

/*调用LWIP初始化函数,
初始化网络接口结构体链表、内存池、pbuf结构体,启动协议栈管理进程*/
lwip_init();

#if LWIP_DHCP //若使用DHCP协议
ipaddr.addr = 0;
netmask.addr = 0;
gw.addr = 0;
for(i = 0; i < 5; i++)
{
dhcp_start(&enc28j60);
IP4_ADDR(&ipaddr,0,0,0,0);
for(cnt = 0; (cnt < 10) && (ipaddr.addr == 0); cnt ++)
{
ipaddr.addr = enc28j60.ip_addr.addr;
for(j = 0; j<100000; j++);
}
dhcp_stop(&enc28j60);
if(ipaddr.addr != 0)
{
break;
}
ipaddr.addr = enc28j60.ip_addr.addr;
netmask.addr = enc28j60.netmask.addr;
gw.addr = enc28j60.gw.addr;
}

#else //
IP4_ADDR(&ipaddr, 192, 168, 0, 16); //设置网络接口的ip地址
IP4_ADDR(&netmask, 255, 255, 255, 0); //子网掩码
IP4_ADDR(&gw, 192, 168, 0, 1); //网关
#endif

/*初始化enc28j60与LWIP的接口,参数为网络接口结构体、ip地址、
子网掩码、网关、网卡信息指针、初始化函数、输入函数*/
netif_add(&enc28j60, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input);

/*把enc28j60设置为默认网卡 .*/
netif_set_default(&enc28j60);

/* When the netif is fully configured this function must be called.*/
netif_set_up(&enc28j60); //使能enc28j60接口

}
...全文
2968 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sddzycnqjn 2014-10-14
  • 打赏
  • 举报
回复
楼主你好,我目前遇到一个问题向你请教一下,希望你能给予一些指点。谢谢。 目前我的硬件环境是:STM32F103 + ucos + lwip 下位机实现了一个TcpServer,目前PC与下位机通信正常。我想在下位机再创建一个新的任务实现一个TcpClient,与PC连接。但是当我创建socket的时候,发现创建失败,失败原因在于memp_malloc返回NULL。 看到你实现了下位机同时做server 和client。所以想请教你。是否是我在lwip配置方面有问题,还是有别的需要注意的地方。 先谢谢了。
evahelen_study 2013-07-28
  • 打赏
  • 举报
回复
这有个Bootp服务器和客户端的源码,与DHCP协议原理是一样的分配IP地址: http://download.csdn.net/detail/geoff08zhang/4571358

18,355

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧