器件型号:DK-TM4C129X
工具/软件:TI-RTOS
我正在开发一个应用程序、需要从网络的 DHCP 服务器获取 IP 地址、主机名和名称服务器信息。
是否有方法可以访问 DHCP 客户端正在使用的信息? 我可以通过某种方式获得指向它正在处理的 DHCPLEASE 结构的指针?
稍后-
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
器件型号:DK-TM4C129X
工具/软件:TI-RTOS
我正在开发一个应用程序、需要从网络的 DHCP 服务器获取 IP 地址、主机名和名称服务器信息。
是否有方法可以访问 DHCP 客户端正在使用的信息? 我可以通过某种方式获得指向它正在处理的 DHCPLEASE 结构的指针?
稍后-
尊敬的 David:
遗憾的是、现在可以获取 DHCPLEASE 本身的指针。
您应该能够通过 Cfg* API 访问所需的信息。 我必须返回到您查找名称服务器、但您可以在平均时间开始使用此代码:
1) 1) IP 地址
字符 IPString[50];
CI_IPNet NA;
CfgGetImmadiate( 0, CFGTAG _IPNet, if_req.index,1, sizeof (NA), (uint8 *)&nA);
NtIPN2Str (na.ipaddr、IPString);
DbgPrintf (DBG_INFO、"IP Address :%s\n"、IPString);
// na.Domain =域名字符串
2) 2)主机名
您应该已经在应用中设置了此项、但是您可以按如下方式获得:
字符主机名[HOSTNAME_LENG];// HOSTNAME_LENGTH = 256
CfgGetImmediation (0、CFGTAG _SYSINFO、CFGITEM_DHCP_HOSTNAME、1、HOSTNAME_LENGTH - 1、 (uint8_t *)主机名);
// hostname[]现在具有主机名字符串
Steve
嗯、我越来越接近降低我可以加载和测试某些东西的位置(不是它将会起作用...)。
首先、BSD/sys/socket.h 和 nettools/inc/netcfg.h 中的函数之间存在重大冲突 、我通过添加一组条件块来解决这一问题、但这不应该是我要做的事情。
基本上、我的17.9.0.STS 版本不再是出厂版本。 主要问题是对几个结构的定义。
现在、根据您提供的代码:
在第1)节中、我可以从何处获取 if_req.index? 我在任何地方都看不到这种定义。
下一个项目。 我不能在我的生命周期内确定如何在 EMACSnow_NIMUInit 中进行链接。 它的定义在哪里、如何将其包括在内?
稍后-
David
David、
[引用 user="David Dudley"] BSD/sys/socket.h 和 nettools/inc/netcfg.h中的函数之间存在重大冲突
您是否在同一源文件中同时包含了 sys/socket.h 和(netmain.h 或 stkmain.h)?
如果是、这可能是您看到碰撞的原因。 您使用的 NDK 版本中的 BSD 支持层限制是 BSD 套接字 API 代码必须与您的"标准 NDK API"代码位于单独的编译单元中。
(通常、如果您需要包含 netmain.h 或 stkmain.h 才能获取特定的 API、则这将是"标准 NDK API")。
我建议重新调整代码、以便一个文件(例如"file A")包含 sys/socket.h 并具有 BSD 调用、而另一个文件("file B")包含 netmain.h 和 stkmain.h、并调用"NDK 标准函数"。
例如、您可能具有以下类似内容:
文件 A:
#include
extern void findIpInfo();
myFxn()
{
findIpInfo();//此函数将调用 Cfg* API 和其他非 BSD NDK 函数
int s =套接字(...);
发送,...);
Recv(s);
关闭;
}
文件 B:
#include
#include
void findIpInfo()
{
字符 IPString[50];
CI_IPNet NA;
CfgGetImmadiate( 0, CFGTAG _IPNet, if_req.index,1, sizeof (NA), (uint8 *)&nA);
NtIPN2Str (na.ipaddr、IPString);
DbgPrintf (DBG_INFO、"IP Address:%s\n"、IPString);
//等
}
更多信息、请参阅 NDK 用户指南
C:\tirtos_tivac_2_16_01_14\products\NDK_2_25_00_09\docs\spru524j.pdf
第3.3.1.1节关于 BSD 兼容性需要注意的事项
->文件分隔
[引用 user="David Dudley"]我已经通过添加一组条件块来解决它,但这不应该是我要做的事情。
通过上述更改、您应该能够撤消此操作。
[引用 user="David Dudley">从哪里可以获得 if_req.index? 我在任何地方都看不到这种定义。
我以前给你的差分是不完整的。 您可以通过如下方式获得:
NIMU_IF_REQ IF_REQ;
memset (&if_req、0、sizeof (Nimu_if_Req));
NIMUIoctl (Nimu_get_device_index、&if_req、/dev/index、sizeof (dev_index);
请参阅 NDK Telnet 控制台代码、了解您尝试执行的操作的更多示例:
C:\tirtos_tivac_2_16_01_14\products\NDK_2_25_00_09/ti/NDK/tools/console/conipaddr.c
[引用 user="David Dudley"]我不能为自己的一生而在 EMACSnow_NIMUInit 中确定如何链接。 它的定义在哪里、如何将其包括在内?[/quot]
此函数来自驱动程序库。 您能否将以下代码添加到项目的*。cfg 文件中? 然后全部重建。
/*========================= TI-RTOS 驱动程序的配置==== //
var driversConfig = xdc.useModule('ti.drivers.Config');
//
*包含 TI-RTOS 驱动程序
*
选择一个:
*- driversConfig.LibType_nonInstrumented (默认)
* 使用针对封装和性能进行优化
的 TI-RTOS 驱动程序库* 而不使用断言或日志。
*- driversConfig.LibType_Instrumented
* 使用 TI-RTOS 驱动程序库在启用断言和日志的情况下进行调试。
//
driversConfig.libType = driversConfig.LibType_noniced;
//driversConfig.libType = driversConfig.LibType_Instrumented;
Steve
[引用用户="David Dudley"]
我知道我在某个地方看到过这个 如何在 DHCP 客户端收到 IP 地址之前阻止主程序启动?
我还记得、有一个报告函数、您可以用来告诉您何时安全运行?
[/报价]
是的、没错、有一个 IP 地址回调函数。 每当从系统中添加或删除 IP 地址时、都会调用它。 因此、这是您应该添加代码以执行所需操作的位置、我只想注意带下划线的部分的重要性。 该函数采用一个参数"fAdd"、这是一个布尔值、如果添加了 IP 地址、则为 true、如果删除了 IP 地址、则为 false。 因此、只需检查 fAdd 参数即可了解发生的情况。
无论如何、您可以通过使用以下设置更新*。cfg 文件将其添加到您的应用中:
Global.networkOpenHook ="&ipAddressHook";
然后、在 C 源代码中(例如、请参阅 tcpEcho 示例应用程序中的示例文件 tcpEchoHooks.c)、添加具有上述指定名称的函数。 在该函数内、您可以发布全局共享信标:
空 ipAddressHook (uint32_t ipaddr、uint32_t IfIdx、uint32_t fADD)
{
如果(fADD){
//例如
Semaphore_post (ipAddrSem);
}
}
然后、在您的网络线程中、首先要做的是阻止 ipAddrSem 信标。 这样、在从 IP 地址挂钩函数内发布信号量之前、代码不会运行:
空 networkAppThread()
{
//例如
Semaphore_pend (ipAddrSem);
//后跟其余的网络代码
}
Steve
尊敬的 David:
是的、IP 地址从 DHCP 服务器接收(由 DHCP 服务器发出)、设置为嵌入式器件的 IP 地址、然后调用此回调函数、传递与 arg 相同的 IP 地址。
我猜您缺少用于处理字节排序的代码。 请参见下面的。
Steve
void ipAddressHook (uint32_t ipaddr、uint32_t IfIdx、uint32_t fADD) { uint32_t iptmp; ... /*打印添加/删除的 IP 地址*/ IPTmp = ntohl (ipaddr);//如果您具有较新的 NDK、则可能是 NDK_ntohl () DbgPrintf (DBG_INFO、"如果-%d:%d.%d.%d.%d\n"、IfIdx、 (uint8_t)(IPTmp>>>24)&0xFF、(uint8_t)(IPTmp>16)&0xFF、 (uint8_t)(IPTmp>>8)&0xFF,(uint8_t) IPTmp&0xFF); ... }