Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1619413
  • 博文数量: 441
  • 博客积分: 20087
  • 博客等级: 上将
  • 技术积分: 3562
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-19 15:35
文章分类

全部博文(441)

文章存档

2014年(1)

2012年(1)

2011年(8)

2010年(16)

2009年(15)

2008年(152)

2007年(178)

2006年(70)

分类: 系统运维

2007-04-24 14:45:24

今天在csdn上看到这样一篇文章:
http://blog.csdn.net/szwpc/archive/2005/10/28/518360.aspx

int gethostname(char *name, size_t len)

这个函数,调用后,会将主机名保存在name里面。而len是name的大小。

以下是例程,编译后只需要运行就知道自己的主机名字了。知道自己名字后,我再调用了一下gethostbyname()来得到主机的一些其他信息。

#include
#include

int main(int argc, char **argv)
{
 struct hostent *hptr;
 char **pptr;
 char hostname[32];
 char str[32];
 
 if( gethostname(hostname,sizeof(hostname)) )
 {
  printf("gethostname calling error\n");
  return 1;
 }
 printf("localhost name:%s\n",hostname);
 if( (hptr = gethostbyname(hostname)) == NULL)
 {
  printf("gethostbyname calling error\n");
  return 1;
 }
 pptr=hptr->h_addr_list;
 for(;*pptr!=NULL;pptr++)
  printf("  address:%s\n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
 
 return 0;
}


   感觉写的不错,于是拷贝下来在VC6下编译,我知道很可能通不过,因为一看程序,就感觉是在linux环境下的,我想把它改为windows环境下的,于是改了改头文件,最后发现根本找不到inet_ntop这个函数,于是又在google上搜一搜,看到这篇文章:

http://www.vckbase.com/document/viewdoc/?id=435

#include 
#include
#include
#include

int main()
{
////////////////
// 初始化 Windows sockets API. 要求版本为 version 1.1
//
WORD wVersionRequested = MAKEWORD(1, 1);
WSADATA wsaData;
if (WSAStartup(wVersionRequested, &wsaData)) {
printf("WSAStartup failed %s\n", WSAGetLastError());
return -1;
}

//////////////////
// 获得主机名.
//
char hostname[256];
int res = gethostname(hostname, sizeof(hostname));
if (res != 0) {
printf("Error: %u\n", WSAGetLastError());
return -1;
}
printf("hostname=%s\n", hostname);
////////////////
// 根据主机名获取主机信息.
//
hostent* pHostent = gethostbyname(hostname);
if (pHostent==NULL) {
printf("Error: %u\n", WSAGetLastError());
return -1;
}
//////////////////
// 解析返回的hostent信息.
//
hostent& he = *pHostent;
printf("name=%s\naliases=%s\naddrtype=%d\nlength=%d\n",
he.h_name, he.h_aliases, he.h_addrtype, he.h_length);

sockaddr_in sa;
for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) {
memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length);
// 输出机器的IP地址.
printf("Address: %s\n", inet_ntoa(sa.sin_addr)); // 显示地址串
}
//////////////////
// 终止 Windows sockets API
//
WSACleanup();
return 0;
}

受到启发,看到后面的一段代码
for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) {
memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length);
// 输出机器的IP地址.
printf("Address: %s\n", inet_ntoa(sa.sin_addr)); // 显示地址串
}

pptr=hptr->h_addr_list;
 for(;*pptr!=NULL;pptr++)
  printf("  address:%s\n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
很相似,于是乎,我就作了以下修改,终于调试通过了:


//#include
//#include
#include
#include

#pragma comment(lib, "ws2_32.lib")

int main(int argc, char **argv)
{
    char *ptr,**pptr;
    struct hostent *hptr;
    WSADATA    wsadata;
    struct sockaddr_in    sa;
//    char str[32];
    /* 取得命令后第一个参数,即要解析的域名或主机名 */
    ptr = argv[1];
   

    if ( 0 != WSAStartup(0x0202, &wsadata) )
        return -1;

    /* 调用gethostbyname()。调用结果都存在hptr中 */
    if( (hptr = gethostbyname(ptr) ) == NULL )
    {
        printf("gethostbyname error for host:%s\n", ptr);
        return 0; /* 如果调用gethostbyname发生错误,返回1 */
    }
    /* 将主机的规范名打出来 */
    printf("official hostname:%s\n",hptr->h_name);
    /* 主机可能有多个别名,将所有别名分别打出来 */
    for(pptr = hptr->h_aliases; *pptr != NULL; pptr++)
        printf("  alias:%s\n",*pptr);
    /* 根据地址类型,将地址打出来 */
    switch(hptr->h_addrtype)
    {
    case AF_INET:
    case AF_INET6:
        pptr=hptr->h_addr_list;
   
        for(;*pptr!=NULL;pptr++)
        {
            memcpy(&sa.sin_addr.s_addr, *pptr, hptr->h_length);
            printf("address: %s\n", inet_ntoa(sa.sin_addr));
        }
            //printf("  address:%s\n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
           
        break;
    default:
        printf("unknown address type\n");
        break;
    }

    WSACleanup();
    return 0;
}

运行一下该程序:
gethostybname.exe
结果如下:
official hostname:www-china.l.google.com
  alias:
  alias:
address: 66.249.89.99

阅读(1100) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~