今天运气不错,花了大半天总算搞懂了两个主角API和一个配角API还有一个结构体,一个gethostname()得到主机名函数,还有一个就是 gethostbyname() 得到主机信息函数(包括IP地址等),还有一个配角 inet_ntoa()转换为IP地址格式的函数,还有一个hostent 结构,该结构是重点哦,应为得到主机信息后就会返回给这个结构,这个结构里可是包含非常多的主机信息了、、、、

【实例】

   char zhujiming[200];  //创建变量来保存本地主机名

 if( gethostname(zhujiming, 200) == 0 )  //判断是否已经得到主机名
 {
      GetDlgItem(IDC_JIMING)->SetWindowText(zhujiming); //在编辑框IDC_JIMING 中显示主机名

     hostent*  xinxi;      //构造hostent* 对象
  xinxi = gethostbyname(zhujiming);  //把主机信息给post对象

  //创建个指针结构来得到该IP地址
  //当然必须要IP地址结构inet_ntoa 函数来转换
        LPCSTR ip=inet_ntoa (*(struct in_addr *)xinxi->h_addr_list[1]);  

 

  //在编辑框IDC_IP中显示IP地址
  GetDlgItem(IDC_IP)->SetWindowText(ip);
  }
 }

 

--------------------------------------------------------------------

慢慢解释咯、看看这句:gethostname(zhujiming, 200)  嗯,需要把函数原型调出来

【函数原型】

int gethostname(
  char FAR* name,   //[out]指向的缓冲区接收本地主机名。(。。则代表一个消息,你弄个变量来等待就是了,前面我们已经搞了个变量了,char zhujiming[200];  这个 zhujiming就是我们用来存放的了,呵呵,我文化不高,可不会英文缩写,所以为了见名知意,则用拼音来表示了
  int namelen    //[在]缓冲区的长度。(哎、MSDN就是这样了,让我们这些文化低的人难以理解,我们直接理解成多少个字符就是了,还记得前面声明的一个变量吗?char zhujiming[200];   这里我们设置成200,则就是能装下200个字符了。
);

下面看看返回值:

如果没有错误发生,此函数返回零。如果发生错误,则返回SOCKET_ERROR,一个特定的错误代码可以通过调用WSAGetLastError检索。(妈的、MSDN写得这么啰嗦,对我们这些文化低的人来说就是在误导我们的时间,我草, 这里直接理解成 正确则返回 0 ;错误则返回 SOCKET_ERROR ,所以我们往往在写程序时候需要加个if判断就需要返回值了)

接着看下去,嗯、轮到构造hostent 结构的对象了,我们先来看看这个结构是怎样的,

【结构原型】

struct hostent {
  char FAR* h_name;   //正式名称的主机。如果使用DNS或类似的决议制度,它是完全合格的域名称(FQDN)导致该服务器返回一个答复。如果使用本地主机文件,它是继IP地址的第一项。
  char FAR* FAR* h_aliases;    //NULL结尾的备用名的数组。
  short h_addrtype;     //地址类型被返回。
  short h_length;       //每个地址的长度,以字节为单位。
  char FAR* FAR* h_addr_list;   //null结尾的主机地址的列表。地址返回网络字节顺序。该宏h_addr被定义为h_addr_list [0] (咦?是个数组类型?则里面有很多的东西了)。
};

 

嗯、结构原型就这样了,我们用这个结构创建的对象来接收gethostbyname() 函数得到的东西,也就是这句了:xinxi = gethostbyname(zhujiming);   那我们就需要看看这个gethostbyname() 函数是啥的意思。。。

【函数原型】

struct hostent FAR* gethostbyname(
  const char FAR* name    //指向空结尾的主机名来解决。(草,MSDN呀,咱们文化低不会英文、用软件翻译过来的就这意思,让人难以理解,还好,搜索引擎的功能强大,在百度上一敲,就有前辈们留下的解释了,真感谢前辈们,这参数的意思就是:指向主机名,主机名?还好刚才我们已经得到了。zhujiming
);

刚才已经把得到的信息传到xinxi 里面,xinxi 是hostent结构的类型,因为我们只需要IP地址,所以我们要选hostent结构的最后一个参数char FAR* FAR* h_addr_list;  该参数是数组的哦,则里面应该存着主机的相关IP地址类的信息,我们这里只是获取外网地址,所以直接在数组里填上1就可以获得外网的IP了(经过我自己摸索的,我也不知道在你们的机子上会不会变,反正在我的机子上就是1了,根据我的发现 0则是本地连接的IP,1则是外网的IP!),如:xinxi->h_addr_list[1]  该参数是IP地址,所以我们引用出来的需要是IP地址的格式,那么则需要inet_ntoa() 函数来转换,则:inet_ntoa (*(struct in_addr *)xinxi->h_addr_list[1]  这样就是了,为了方便我们可以建立个指针类型的变量来得到该地址,因为该参数是FAR* FAR* 指针类型,当然了,不需要也行的,你自己看这决定就可以了,则:LPCSTR ip=inet_ntoa (*(struct in_addr *)xinxi->h_addr_list[1]);   

 整个程序可以这样缩写:

char zhujiming[200];

 if( gethostname(zhujiming, 200) == 0 )

{

GetDlgItem(IDC_JIMING)->SetWindowText(zhujiming);  //可以不写

hostent*  xinxi = gethostbyname(zhujiming);

GetDlgItem(IDC_IP)->SetWindowText(inet_ntoa (*(struct in_addr *)xinxi->h_addr_list[1]));

}

好了,这个程序就完成了!谢谢大家啊,希望大家把自己会的API都记起来,这样既方便自己,也可以和别人共享,交流,帮助别人就是帮助自己,。以上都是我看了一篇实例,然后翻译MSDN 摸索出来的,哪里出错了勿怪,!!!哈哈!By: 瑜少

posted on 2009-12-13 18:20  小小笔记,大大世界!  阅读(1670)  评论(0编辑  收藏  举报