简述:
返回对应于给定主机名的主机信息。
#include <winsock2.h>
struct hostent FAR *PASCAL FAR gethostbyname(const char
FAR * name);
name:指向主机名的指针。
注释:
gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。结构的声明与gethostaddr()中一致。
返回的指针指向一个由Windows Sockets实现分配的结构。应用程序不应该试图修改这个结构或者释放它的任何部分。此外,每一线程仅有一份这个结构的拷贝,所以应用程序应该在发出其他Windows Scokets API调用前,把自己所需的信息拷贝下来。
gethostbyname()实现没有必要识别传送给它的IP地址串。对于这样的请求,应该把IP地址串当作一个未知主机名同样处理。如果应用程序有IP地址串需要处理,它应该使用inet_addr()函数把地址串转换为IP地址,然后调用gethostbyaddr()来得到hostent结构。
返回值:
如果没有错误发生,gethostbyname()返回如上所述的一个指向hostent结构的指针,否则,返回一个空指针。应用程序可以通过WSAGetLastError()来得到一个特定的错误代码。
错误代码:
WSANOTINTIALISED 在应用这个API前,必须成功地调用WSAStartup()。
WSAENTDOWN Windows Sockets实现检测到了网络子系统的错误。
WSAHOST_NOT_FOUND 没有找到授权应答主机。
WSATRY_AGAIN 没有找到非授权主机,或者SERVERFAIL。
WSANO_RECOVERY 无法恢复的错误,FORMERR,REFUSED,NOTIMP。
WSANO_DATA 有效的名字,但没有关于请求类型的数据记录。
WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行。
WSAEINTR 阻塞调用被WSACancelBlockingCall()取消了.
需要注意的是gethostbyname()函数属于WinSock API库,而在使用WinSock API之前,必须调用WSA-Startup函数,只有该函数成功返回(表示应用程序与WinSock库成功地建立起连接),应用程序才可以调用其他Windows Sockets DLL中的函数。当程序将要结束时,又必须调用WSACleanup 函数进行清理工作,以便释放其占用的资源。WSACleanup 函数用来结束Windows Sockets DLL的使用。
参见: WSAAsyncGetHostByName(), gethostbyaddr()
标准C++ 2009-10-28 15:35:49 阅读289 评论0 字号:大中小
struct hostent {
char FAR * h_name;
char FAR * FAR * h_aliases;
short h_addrtype;
short h_length;
char FAR * FAR * h_addr_list;
};
h_name // Official name of the host (PC). If using the DNS or similar resolution system, it is the Fully Qualified
// Domain Name (FQDN) that caused the server to return a reply. If using a local hosts file, it is the
// first entry after the IP address.
//主机的正式名称,如果用的是DNS系统或者其他类似的域名解析系统,这就是域名全称,如果用的是
// local hosts 文件,那么这个就是 IP 地址后面的第一个名称
// [小知识:hosts 文件在 C:\WINDOWS\system32\drivers\etc 目录下]
h_aliases //Null-terminated array of alternate names.
//是 一个 char* 数组,是域名的别名,可以有多个
h_addrtype //Type of address being returned.
// 返回地址类型,通常是 AF_INET IPV4 或者 AF_INET6 IPV6
h_length // Length of each address, in bytes.
// 地址字节数,IPV4 是 4,IPV6 是 6
h_addr_list // Null-terminated list of addresses for the host.Addresses are returned in network byte order. The
// macro h_addr is defined to be h_addr_list[0] for compatibility with older software.
// 主机地址列表,该值是网络字节序,为了兼容老的版本 h_addr_list[0] = h_addr
可以测试如下:
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
void main()
{
WSADATA wsaData;
if(!WSAStartup(MAKEWORD(2, 2), &wsaData))
{
struct hostent* phost;
phost = gethostbyname("www.baidu.com");
cout << "Name: " << phost->h_name << endl;
cout << "Length:" << phost->h_length << endl;
int i = 0;
while(phost->h_aliases[i])
{
cout << "Aliases: " << phost->h_aliases[i] << endl;
++i;
}
}
}
OK,看下面的示例,我们来通过 域名 获得 IP 地址:
#include <iostream>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
PHOSTENT phost;
phost = gethostbyname("www.baidu.com");
sockaddr_in sa;
int i = 0;
while((*phost).h_addr_list[i])
{
//cout << inet_ntoa(*(struct in_addr*)(*phost).h_addr_list[i]) << endl; //这样也可以
memmove(&sa.sin_addr.S_un.S_addr, (*phost).h_addr_list[i], (*phost).h_length);
cout << inet_ntoa(sa.sin_addr) << endl;
++i;
}
}
char FAR * inet_ntoa( struct in_addr in );
// The inet_ntoa function converts an (Ipv4) Internet network address into a string in Internet
// standard dotted format.
struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
sockaddr_in sa;
sa.sin_addr; //是 in_addr 类型
inet_ntoa(sa.sin_addr); //这时候,函数返回 IP 地址的字符串
返回对应于给定主机名的主机信息。
#include <winsock2.h>
struct hostent FAR *PASCAL FAR gethostbyname(const char
FAR * name);
name:指向主机名的指针。
注释:
gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。结构的声明与gethostaddr()中一致。
返回的指针指向一个由Windows Sockets实现分配的结构。应用程序不应该试图修改这个结构或者释放它的任何部分。此外,每一线程仅有一份这个结构的拷贝,所以应用程序应该在发出其他Windows Scokets API调用前,把自己所需的信息拷贝下来。
gethostbyname()实现没有必要识别传送给它的IP地址串。对于这样的请求,应该把IP地址串当作一个未知主机名同样处理。如果应用程序有IP地址串需要处理,它应该使用inet_addr()函数把地址串转换为IP地址,然后调用gethostbyaddr()来得到hostent结构。
返回值:
如果没有错误发生,gethostbyname()返回如上所述的一个指向hostent结构的指针,否则,返回一个空指针。应用程序可以通过WSAGetLastError()来得到一个特定的错误代码。
错误代码:
WSANOTINTIALISED 在应用这个API前,必须成功地调用WSAStartup()。
WSAENTDOWN Windows Sockets实现检测到了网络子系统的错误。
WSAHOST_NOT_FOUND 没有找到授权应答主机。
WSATRY_AGAIN 没有找到非授权主机,或者SERVERFAIL。
WSANO_RECOVERY 无法恢复的错误,FORMERR,REFUSED,NOTIMP。
WSANO_DATA 有效的名字,但没有关于请求类型的数据记录。
WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行。
WSAEINTR 阻塞调用被WSACancelBlockingCall()取消了.
需要注意的是gethostbyname()函数属于WinSock API库,而在使用WinSock API之前,必须调用WSA-Startup函数,只有该函数成功返回(表示应用程序与WinSock库成功地建立起连接),应用程序才可以调用其他Windows Sockets DLL中的函数。当程序将要结束时,又必须调用WSACleanup 函数进行清理工作,以便释放其占用的资源。WSACleanup 函数用来结束Windows Sockets DLL的使用。
参见: WSAAsyncGetHostByName(), gethostbyaddr()
标准C++ 2009-10-28 15:35:49 阅读289 评论0 字号:大中小
struct hostent {
char FAR * h_name;
char FAR * FAR * h_aliases;
short h_addrtype;
short h_length;
char FAR * FAR * h_addr_list;
};
h_name // Official name of the host (PC). If using the DNS or similar resolution system, it is the Fully Qualified
// Domain Name (FQDN) that caused the server to return a reply. If using a local hosts file, it is the
// first entry after the IP address.
//主机的正式名称,如果用的是DNS系统或者其他类似的域名解析系统,这就是域名全称,如果用的是
// local hosts 文件,那么这个就是 IP 地址后面的第一个名称
// [小知识:hosts 文件在 C:\WINDOWS\system32\drivers\etc 目录下]
h_aliases //Null-terminated array of alternate names.
//是 一个 char* 数组,是域名的别名,可以有多个
h_addrtype //Type of address being returned.
// 返回地址类型,通常是 AF_INET IPV4 或者 AF_INET6 IPV6
h_length // Length of each address, in bytes.
// 地址字节数,IPV4 是 4,IPV6 是 6
h_addr_list // Null-terminated list of addresses for the host.Addresses are returned in network byte order. The
// macro h_addr is defined to be h_addr_list[0] for compatibility with older software.
// 主机地址列表,该值是网络字节序,为了兼容老的版本 h_addr_list[0] = h_addr
可以测试如下:
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
void main()
{
WSADATA wsaData;
if(!WSAStartup(MAKEWORD(2, 2), &wsaData))
{
struct hostent* phost;
phost = gethostbyname("www.baidu.com");
cout << "Name: " << phost->h_name << endl;
cout << "Length:" << phost->h_length << endl;
int i = 0;
while(phost->h_aliases[i])
{
cout << "Aliases: " << phost->h_aliases[i] << endl;
++i;
}
}
}
OK,看下面的示例,我们来通过 域名 获得 IP 地址:
#include <iostream>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
PHOSTENT phost;
phost = gethostbyname("www.baidu.com");
sockaddr_in sa;
int i = 0;
while((*phost).h_addr_list[i])
{
//cout << inet_ntoa(*(struct in_addr*)(*phost).h_addr_list[i]) << endl; //这样也可以
memmove(&sa.sin_addr.S_un.S_addr, (*phost).h_addr_list[i], (*phost).h_length);
cout << inet_ntoa(sa.sin_addr) << endl;
++i;
}
}
char FAR * inet_ntoa( struct in_addr in );
// The inet_ntoa function converts an (Ipv4) Internet network address into a string in Internet
// standard dotted format.
struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
sockaddr_in sa;
sa.sin_addr; //是 in_addr 类型
inet_ntoa(sa.sin_addr); //这时候,函数返回 IP 地址的字符串