域名,IP地址相互转换等

简述:
  返回对应于给定主机名的主机信息。
  #include
  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
#include
#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      
#include      
   
#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 地址的字符串

你可能感兴趣的:(网络编程)