今天运气不错,花了大半天总算搞懂了两个主角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: 瑜少