MTK 编程小节 之 域名解析

来源:互联网 发布:中国数据新闻网 编辑:程序博客网 时间:2024/06/06 03:06
MTK 编程小节 之 域名解析


对于网络编程而言,硬编码IP到客户端,定是下下策,为此,我们需要域名解析功能。MTK对此有类似的解决之道,即soc_gethostbyname,下面将它的用法简单叙述如下
soc_gethostbyname( kal_bool is_blocking,//是否为阻塞式调用,手机平台一般不会支持阻塞式调用的
module_type mod_id, //调用该函数的模块id,也即将来接收消息的模块
kal_int32 request_id,//用于区分是那个请求之用,我们自定义的id值,标示不同的应用
const kal_char *domain_name,//域名
kal_uint8 *addr,//ipv4的ip地址,将来也许会有ipv6的
kal_uint8 *addr_len,//数据长度
kal_uint8 access_id,//这个访问控制id,我没有使用给它赋值为0好了
kal_uint32 nwk_account_id //手机gprs帐户id,做过手机的人自然会明白
)//

补充,调用这个函数不需要建立socket,而且是我们建立tcp/ip连接之前,必须完成一个必备步骤
实例代码如下:

typedef void (* mf_funcOnGetHostByName)(mf_u32 hAddr,mf_u32 nAddr);
static mf_funcOnGetHostByName mf_dnsFunc = NULL;

#define MF_DNS_APPID 1

static void MF_dns_event(void * inMsg)
{
app_soc_get_host_by_name_ind_struct *dns_ind;
if( inMsg )
{
dns_ind = (app_soc_get_host_by_name_ind_struct*) inMsg;
if (dns_ind->result == KAL_TRUE)
{
mf_u32 ipAddr = 0;
switch (dns_ind->request_id)
{
case MF_DNS_APPID:
ClearProtocolEventHandler(MSG_ID_APP_SOC_GET_HOST_BY_NAME_IND);
kal_prompt_trace(MOD_ENG,"MF_getHostByName ip: %d, %d, %d, %d", dns_ind->addr[0], dns_ind->addr[1], dns_ind->addr[2], dns_ind->addr[3]);
MF_memcpy(&ipAddr, dns_ind->addr,dns_ind->addr_len);
if( mf_dnsFunc )
mf_dnsFunc(MF_ntohl((mf_u32)ipAddr),ipAddr);
mf_dnsFunc = NULL;
break;
}
}
}
else if( mf_dnsFunc )
{
mf_dnsFunc(0,0);
}
}

mf_bool MF_getHostByName(mf_s8 * server_domain,mf_u32 * hAddr,mf_u32 * nAddr, mf_funcOnGetHostByName func)
{
kal_int8 ret = MF_FALSE;
static kal_uint8 addr_len=0;
kal_uint32 nwk_account_id = mf_skt_account;
static kal_int16 sDNSHandle = MF_DNS_APPID;
static kal_uint32 ipAddr;

mf_dnsFunc = func;

ret = soc_gethostbyname(KAL_FALSE,
MOD_MMI,
(kal_int32)sDNSHandle,
(const kal_char *)server_domain,
(kal_uint8*)&ipAddr,
(kal_uint8*)&addr_len,
(kal_uint8)0,
nwk_account_id);

if (ret == SOC_SUCCESS)
{
kal_uint8 *ptr;
ptr = (kal_uint8*)&ipAddr;

kal_prompt_trace(MOD_ENG,"MF_getHostByName ip: %d, %d, %d, %d", ptr[0], ptr[1], ptr[2], ptr[3]);
if(hAddr)
*hAddr = MF_ntohl((mf_u32)ipAddr);
if(nAddr)
*nAddr = (mf_u32)ipAddr;

return MF_TRUE;
}
else if(ret == SOC_WOULDBLOCK)
{
SetProtocolEventHandler(MF_dns_event, MSG_ID_APP_SOC_GET_HOST_BY_NAME_IND);
}

kal_prompt_trace(MOD_ENG," MF_getHostByName , ret %d", ret);

return ret;
}