拨号成功后,gethostbyname重试多次才能成功

snjsj 2009-11-12 02:01:59
在WindowsMobile6设备上,用ConnMgr的函数拨号成功以后(使用的同步拨号函数,确定已经返回成功),再调用gethostbyname()来解析一个域名,根据测试结果,需要20次左右重试才能得到IP。整个过程耗时40秒左右(拨号10s,轮询gethostbyname大概30秒)。

而使用自带的IE进行拨号并打开网页的总时间大约只需要20秒左右。请问是否有人知道为什么?或者我少调用了什么API或者设置不正确?
...全文
150 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
snjsj 2010-02-05
  • 打赏
  • 举报
回复
问题已经解决。
根据所调查到的情况推测,在WM上,如果在没有建立拨号连接之前就调用gethostbyname或者getaddrinfo,然后进行拨号(比如异步?),就会出现这个问题。我认为是系统API的一个bug吧。

解决的办法有二:
1) 用别的接口代替gethostbyname,比如用DNSQuery,或者你自己实现一个类似的东西。
2) 一定要先拨号,保证已经有连接,再调用。
nzc123 2010-01-05
  • 打赏
  • 举报
回复
LZ问题解决了吗? 我也遇到和你一样的问题,郁闷。
snjsj 2009-11-14
  • 打赏
  • 举报
回复
getaddrinfo在速度上没有任何优势。时间和gethostbyname几乎一样。
烂番 2009-11-12
  • 打赏
  • 举报
回复
换这个API试试看,注意换成Unicode版的:“DnsQuery_W”


int getIPbyURL2(const char *url, char *ip)
{
DNS_STATUS status; // return value of DnsQuery_A() function.
DNS_RECORD *pDnsRecord; //pointer to DNS_RECORD structure
IN_ADDR ipaddr;

status = DnsQuery_A(url, //pointer to OwnerName
DNS_TYPE_A, //Type of the record to be queried
DNS_QUERY_BYPASS_CACHE, // Bypasses the resolver cache on the lookup.
NULL, //contains DNS server IP address
&pDnsRecord, //Resource record comprising the response
NULL); //reserved for future use

if (status)
{
return -1;
}

while(pDnsRecord)
{
if(1== pDnsRecord->wType)
{
ipaddr.S_un.S_addr = (pDnsRecord->Data.A.IpAddress);
strcpy(ip, inet_ntoa(ipaddr));
DnsRecordListFree(pDnsRecord, DnsFreeRecordListDeep);

return 0;
}
pDnsRecord = pDnsRecord->pNext;
}

DnsRecordListFree(pDnsRecord, DnsFreeRecordListDeep);
return -1;
}
ruritanian 2009-11-12
  • 打赏
  • 举报
回复
用ConnMgrConnectionStatus看一下状态确认一下试试看
另外gethostbyname这个函数会发DNS数据报文去查询,所以调用这个函数会耗不少时间在网络上的。特别是如果查询不到的话,会一直等到timeout.
thinkinwm 2009-11-12
  • 打赏
  • 举报
回复
mark
世外涛缘 2009-11-12
  • 打赏
  • 举报
回复
拨号成功后调用gethostbyname返回空的时候,调用WSAGetLastError看看返回什么错误。
儿大不由爷 2009-11-12
  • 打赏
  • 举报
回复
拨号成功后你稍等在试试,比如Sleep 20秒
snjsj 2009-11-12
  • 打赏
  • 举报
回复
WSAGetLastError() 一般都返回的是WSAHOST_NOT_FOUND。

getaddrinfo这个函数以前一直以为是为了线程安全和IPV6做的,难道还能更快?我待会试一下。
ProgrammerNO1 2009-11-12
  • 打赏
  • 举报
回复
有getlasterror() 么
ruritanian 2009-11-12
  • 打赏
  • 举报
回复
IE用的是getaddrinfo
snjsj 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ultrapro 的回复:]
拨号成功后你稍等在试试,比如Sleep 20秒
[/Quote]
是的,是在一个线程中做的,所以不停的sleep然后retry。但是IE确实快很多,我不知道为什么。

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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