【创龙TMS320C665x开发板试用】基础(十六):SYSBIOS-NDK(3)

上一篇说的是为NDK设置静态IP,但是有时会有IP冲突,那还要更改程序进行IP的更改就会太麻烦了,自然就会有了动态IP。
动态IP其实就是启动DHCP服务。
而什么是DHCP呢?
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、 Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。
DHCP有三种机制分配IP地址:
1) 自动分配方式(Automatic Allocation),DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址。
2) 动态分配方式(Dynamic Allocation),DHCP服务器给主机指定一个具有时间限制的IP地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。
3) 手工分配方式(Manual Allocation),客户端的IP地址是由网络管理员指定的,DHCP服务器只是将指定的IP地址告诉客户端主机。
三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。
 
回到正题,NDK中DHCP的配置主要是使用CI_SERVICE_DHCPC结构体。
CI_SERVICE_DHCPC结构体主要有两个成员,如下图:


 
其中又包含了CISARGS结构体与NTPARAM_DHCP结构体。
CISARGS结构体:
 
Item这是添加到配置时使用的项目值的副本。
hService服务请求的句柄。
Mode模式参数是表示服务所需执行行为的标志集合,它的值有以下几个:

 
Status 网络控制服务回调检测的服务状态。

 
IFIdx  是物理设备的编号。
IPAddr 是服务初始化时的 IP 地址。
最后一个函数指针是回调函数。
这个函数在程序中的实现为:
  1. void ServiceReport(unsigned int Item, unsigned int Status, unsigned int Report, HANDLE h)
  2. {
  3.         platform_write("Service Status: %9s: %9s: %9s: %03d\n",
  4.                              TaskName[Item - 1], StatusStr[Status], ReportStr[Report / 256], Report & 0xFF);
  5.  
  6.     // 配置 DHCP
  7.     if(Item == CFGITEM_SERVICE_DHCPCLIENT &&
  8.        Status == CIS_SRV_STATUS_ENABLED &&
  9.        (Report == (NETTOOLS_STAT_RUNNING|DHCPCODE_IPADD) ||
  10.         Report == (NETTOOLS_STAT_RUNNING|DHCPCODE_IPRENEW)))
  11.     {
  12.         IPN IPTmp;
  13.  
  14.         // 配置 DNS
  15.         IPTmp = inet_addr(DNSServer);
  16.         if(IPTmp)
  17.         {
  18.             CfgAddEntry(0, CFGTAG_SYSINFO, CFGITEM_DHCP_DOMAINNAMESERVER, 0, sizeof(IPTmp), (UINT8 *)&IPTmp, 0);
  19.         }
  20.  
  21.         // DHCP 状态
  22.         DHCPStatus();
  23.     }
  24.  
  25.     // 重置 DHCP 客户端服务
  26.     if(Item == CFGITEM_SERVICE_DHCPCLIENT && (Report & ~0xFF) == NETTOOLS_STAT_FAULT)
  27.     {
  28.         CI_SERVICE_DHCPC dhcpc;
  29.         int tmp;
  30.  
  31.         // 取得 DHCP 入口数据(传递到 DHCP_reset 索引)
  32.         tmp = sizeof(dhcpc);
  33.         CfgEntryGetData(h, &tmp, (UINT8 *)&dhcpc);
  34.  
  35.         // 创建 DHCP 复位任务(当前函数是在回调函数中执行所以不能直接调用该函数)
  36.         TaskCreate(DHCPReset, "DHCPreset", OS_TASKPRINORM, 0x1000, dhcpc.cisargs.IfIdx, 1, 0);
  37.     }
  38. }
复制代码
 
NTPARAM_DHCP结构体:

 
pOptions 是一个指向 DHCP 配置的指针。
len 是指 pOptions 的长度。
 
最后DHCP的配置如下:
 
  1.                 bzero(&dhcpc, sizeof(dhcpc));
  2.         dhcpc.cisargs.Mode   = CIS_FLG_IFIDXVALID;
  3.         dhcpc.cisargs.IfIdx  = 1;
  4.         dhcpc.cisargs.PCBSrv = &ServiceReport;
  5.         dhcpc.param.pOptions = DHCP_OPTIONS;
  6.         dhcpc.param.len = 2;
  7.         CfgAddEntry(hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE_DHCPCLIENT, 0, sizeof(dhcpc), (UINT8 *)&dhcpc, 0);
复制代码
 
仍然是用 CfgAddEntry() 函数将 DHCP 的配置添加到 hCfg 句柄中。
 
由于接下来的几篇都是NDK的讲解与使用方法的说明,在NDK的最后一篇将把所有的源码与二进制文件上传。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值