首页 > tips, TroubleShooting > linux下的gethostbyname是否跟windows下的不一样?

linux下的gethostbyname是否跟windows下的不一样?

2010年8月7日 发表评论 阅读评论

最近碰到个问题
某个域名
在linux下ping不了、wget不了、curl不了,都出“unknown host”的错误
但是nslookup却还是能解析出域名的
检查了/etc/hosts、/etc/host.conf、/etc/nsswitch.conf以及/etc/resolv.conf都没有问题
而且在windows下却没有任何问题
联想到ping、wget、curl等网络程序应该都是调用的同一函数来解析域名的
进一步了解应该是gethostbyname函数
写了个简单的程序用gethostbyname
果然出错
于是装上glibc的源代码
找到gethostbyname函数所在程序resolv/gethnamaddr.c
最终在resolv/res_comp.c中找到了答案:

int
res_hnok(const char *dn) {
int ppch = ‘\0’, pch = PERIOD, ch = *dn++;
while (ch != ‘\0’) {
int nch = *dn++;
if (periodchar(ch)) {
(void)NULL;
} else if (periodchar(pch)) {
if (!borderchar(ch))
return (0);
} else if (periodchar(nch) || nch == ‘\0’) {
if (!borderchar(ch))
return (0);
} else {
if (!middlechar(ch))
return (0);
}
ppch = pch, pch = ch, ch = nch;
}
return (1);
}
libresolv_hidden_def (res_hnok)
应该就是这个res_hnok这个函数判断名字不合法而导致返回0
最终h_error被设置为”NO_RECOVERY”
并gethostbyname返回NULL
呵呵
就是因为这个域名解析出来的某一级CNAME居然是*.xxx.xxx这个样子
于是被res_hnok函数认为非法
不过为啥windows下没有问题
这个估计是linux和windows下的gethostbyname不太一样吧
windows总是这样特立独行,不太愿意跟标准兼容的
:)
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.