工具/软件:TI-RTOS
我正在尝试使 DNS 正常工作、但这似乎不是很容易。 函数 DNSGetHostByName 总是无法解析 IP 地址、因此我必须使用 getaddrinfo。 唯一的问题是、只有当我从 networkIPAddrHook 动态创建任务时、它才起作用。 如果我静态创建一个任务(意味着将其添加到.cfg 文件中)、它将无法获取地址。 所有代码和输出的下方。
TI-RTOS:2.16.1.14
XDCTools:3.32.0.06
NDK:2.25.00.09
.cfg
/*========================= NDK 配置=================== //
var NDK= xdc.loadPackage ('ti.ndk.config');
var Global= xdc.useModule('ti.ndk.config.Global');
var IP= xdc.useModule('ti.ndk.config.Ip');
var UDP= xdc.useModule('ti.ndk.config.Udp');
var TCP= xdc.useModule('ti.ndk.config.Tcp');
var DNS= xdc.useModule('ti.ndk.config.Dns');
Global. ipv6 = false;
Global. stackLibType = Global. min;
Global.networkOpenHook ="&TcpHooks_vNetOpenHook";
Global.networkIPAddrHook ="&TcpHooks_vAddrIPHooks";
(这无法解析 IP 地址)
var task11Params = new Task.Params ();
task11Params.instance.name ="hDnsTest";
task11Params.priority = 1;
Program.global.hDnsTest = Task.create ("&testTaskFxn"、task11Params);
//自动调用 fdOpen/CloseSession for our 套接字任务*/
Global.autoOpenCloseFD = true;
Global. pktNumFrameBufs=10;
Global. memRawPageCount = 6;
Global. ndkThreadStackSize = 1536;
Global. lowTaskStackSize = 1024;
Global.normTaskStackSize = 1024;
Global. highTaskStackSize = 1024;
//Global. stackBeginHook ="&TcpHooks_vReadIPAddress";
tcp.transmitBufSize = 1024;
tcp.receiveBufSize = 1024;
Ip.autoIp = true;
tcphooks.c
解析 IP 地址以测试
#define HOSTNAME 的任务 "www.google.de
"静态字符条[iNet_ADDRSTRLEN];
void testTaskFxn (UArg0、UArgarg1)
{
struct addrinfo * server_data = NULL;
INT 结果;
Task_sleep (5000);
while (1)
{
System_printf ("!!!!!!!!!!! \n"、结果);
结果= getaddrinfo (HOSTNAME、"0"、NULL、&server_data);
system_printf ("getaddrinfo 结果:%d\n"、结果);
if (结果=0 && server_data!= NULL)
{
struct sockaddr addr =*(server_data->ai_addr);
iNet_ntop (AF_iNet、&(struct sockaddr_in *)&addr)->sin_addr、strip、iNet_ADDRSTRLEN);
System_printf ("已解析的地址:%s\n"、条图);
freedrinfo (server_data);
SERVER_DATA =空;
}
Task_sleep (5000);
}
}
networkIPAddrHook:
void TcpHooks_vIPAddrHook (IPN ipaddr、uint IfIdx、uint fAdd)
{
IPN IPTmp;
CI_IPNet NA;
句柄 hCfg;
int RC = 0;
字符 IPString[16];
hCfg = CfgGetDefault();
/*初始化 IP 地址块。 *
bzero (不适用、sizeof (CI_IPNet));
如果(fADD)
{
system_printf ("networkIPAddrHook:添加了网络\n");
}
其他
{
system_printf ("networkIPAddrHook:网络已移除\n");
}
IPTmp = ntohl (ipaddr);
System_printf ("networkIPAddrHook:\tif-%d:%d.%d.%d.%d\n"、IfIdx、
(uint8)(IPTmp>>24)&0xFF、(uint8)(IPTmp>16)&0xFF、
(uint8)(iptmp>>8)&0xFF、(uint8) iptmp&0xFF);
/*仅当存在 IP 地址信息时,才打印该 IP 地址信息。 *
IF (CfgGetImmadi调解(hCfg、CFGTAG _IPNet、1、1、sizeof (NA)、 (uint8 *)&nA)=sizeof (nA)
{
//是的,设备已配置,我们获得了 IP 地址/掩码*/
NtIPN2Str (na.ipaddr、IPString);
System_printf ("IP 地址:%s\n"、IPString);
NtIPN2Str (na.IPMask、IPString);
System_printf ("IP 子网掩码:%s\n"、IPString);
}
其他
{
System_printf ("IP 地址和子网掩码不可用\n");
}
RC = CfgGetImmadi调解(hCfg、CFGTAG _SYSINFO、CFGITEM_DHCP_DOMAINNAMESERVER、
1、4、(uint8 *)&iptmp);
如果(RC = 4)
{
IPTmp = ntohl (IPTmp);
System_printf ("networkIPAddrHook:\tif-%d:DNS =%d.%d.%d.%d\n"、IfIdx、
(uint8)(IPTmp>>24)&0xFF、(uint8)(IPTmp>16)&0xFF、
(uint8)(IPTmp>>8)&0xFF、(uint8) IPTmp&0xFF);
}
其他
{
system_printf ("networkIPAddrHook:DNS IP 获取失败!!!\n");
}
//如果任务未在.cfg 文件中定义,则会创建此任务
Task_Params taskParams;
ERROR_Block EB;
静态 bool init = false;
静态 Task_handle 任务处理;
/*添加 IP 地址时创建 HTTP 任务*/
if (fADD &&!init)
{
init = true;
ERROR_INIT (&EB);
Task_Params_init (&taskParams);
taskParams.STACKSIZE = 4096;
taskParams.priority = 1;
taskHandle = Task_create ((Task_FuncPtr) testTaskFxn、&taskParams、&EB);
if (taskHandle == NULL){
System_printf ("创建任务失败\n");
}
其他
{
system_printf ("已在 prioirty 1\r\n"创建任务);
}
}
结果:
在 ipaddhook 中创建任务时:
!!!!!!!!!!!
,getaddrinfo 结果:0
解析地址:216.58.213.195
在.cfg 中创建任务时
!!!!!!!!!!!
,00005.005 getaddrinfo:错误:无法解析主机名“www.google.de”
、
,getaddrinfo 结果:-2
!!!!!!!!!!!
,00010.005 getaddrinfo:错误:无法解析主机名“www.google.de”
、
,getaddrinfo 结果:-2
那么、问题是、为什么我只能 从从 ipaddrhook 动态创建的任务中成功调用 getaddrinfo? 为什么 DNSGetHostByName 根本不起作用?
JHi