注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

widebright的个人空间

// 编程和生活

 
 
 

日志

 
 

gethostbyname返回错误的ip地址,getaddrinfo是对的,奇怪的问题  

2012-11-30 13:00:30|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
测试log4cpp的时候发现 gethostbyname返回的 ip地址总是广播地址, 比如写的本机的hostname或者ip进去,返回的都是  192.255.255.255这样的,以前外部的网站返回就是   8.0.0.0 这样的,后面3位要么全是255,要么全市0,反正地址都不对。不清楚怎么回事。 还好 getaddrinfo 能正常工作,就把代码改成用这个getaddrinfo的api了。

log4cpp里面的代码是这样的,后面的是我加上去的。


void RemoteSyslogAppender::open() {
if (!_ipAddr) {
// struct hostent *pent = gethostbyname (_relayer.c_str ());
//#ifdef WIN32
// if (pent == NULL) {
// if (WSAGetLastError () == WSANOTINITIALISED) {
// WSADATA wsaData;
// int err;
//
// err = WSAStartup (0x101, &wsaData );
// if (err) {
// // loglog("RemoteSyslogAppender: WSAStartup returned %d", err);
// return; // fail silently
// }
// pent = gethostbyname (_relayer.c_str ());
// _cludge = 1;
// } else {
// // loglog("RemoteSyslogAppender: gethostbyname returned error");
// return; // fail silently
// }
// }
//#endif
// if (pent == NULL) {
// in_addr_t ip = inet_addr (_relayer.c_str ());
// pent = gethostbyaddr ((const char *) &ip, sizeof(in_addr_t), AF_INET);
// if (pent == NULL) {
// // loglog("RemoteSyslogAppender: failed to resolve host %s", _relayer.c_str());
// return; // fail silently
// }
// }
// _ipAddr = *(pent->h_addr);


WSADATA wsaData;
int iResult;
DWORD dwRetval;

struct addrinfo *result = NULL;
struct addrinfo *ptr = NULL;
struct addrinfo hints;
struct sockaddr_in *sockaddr_ipv4;

ZeroMemory( &hints, sizeof(hints) );
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;

dwRetval = getaddrinfo(_relayer.c_str (), "514", &hints, &result);
if ( dwRetval != 0 && WSAGetLastError () == WSANOTINITIALISED) {

iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return ;
}
dwRetval = getaddrinfo(_relayer.c_str (), "514", &hints, &result);
if (dwRetval!=0) {
printf("getaddrinfo failed with error: %d\n", dwRetval);
return;
}
}

if (result != NULL) {
sockaddr_ipv4 = (struct sockaddr_in *) result->ai_addr;
_ipAddr = sockaddr_ipv4->sin_addr.S_un.S_addr;
} else {
printf("getaddrinfo failed result is null\n");
return;
}

}
// Get a datagram socket.

if ((_socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
// loglog("RemoteSyslogAppender: failed to open socket");
return; // fail silently
}
}



 

  评论这张
 
阅读(837)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017