一、所用API函数介绍

struct hostent FAR*gethostbyname( const char FAR* name );

传入參数:const char FAR* name。主机名或者域名

返回值:一个指向struct hostent的指针

结构体hostent定义例如以下:

struct hostent {

char FAR *       h_name;

char FAR * FAR * h_aliases;

short            h_addrtype;

short            h_length;

char FAR * FAR * h_addr_list;

};

结构体hostent成员介绍:

h_name:官方的主机名称,比方www.baidu.com的是www.a.shifen.com。

MSDN上的: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.

h_aliases:主机别名、备用名。这是一个二级指针(别名可能会有多个,便于用户使用)

h_addrtype:地址类型,比方有IPV4、IPV6等。其在winsock.h文件里相应的宏为AF_INET与AF_INET6

h_length:地址长度,以字节为单位,如:IPV4的为4。IPV6的为16等

h_addr_list:主机的地址列表,即主机的IP地址列表,也是一个二级指针(可能会有多个,一个域名能够绑定多个ip。比方解析谷歌的,会输出74.125.23.99,74.125.23.147,74.125.23.105等等)。注意此处返回的地址是网络字节序的。所以须要进行一下转换,详细可看后面代码部分。

二、程序代码实现(在windows平台下)



#include <Winsock2.h>
#include <ws2tcpip.h>
#include <iostream> using namespace std; #pragma comment(lib, "Ws2_32.lib") int main()
{
//使用Ws2_32.dll的初始化
WORD wVersionRequested = 0;
WSADATA wsaData = {};
int err = 0; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return -1;
} if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{ WSACleanup( );
return -1;
} //////////////////////////
char** pptr = NULL;
char szHostName[256] = {};
cout << "--------------------------------------" << endl;
cout << "输入域名:";
while( cin.getline( szHostName, sizeof(szHostName) ) )
{
HOSTENT* pHostEntry = gethostbyname( szHostName );
if( NULL != pHostEntry && szHostName[0] != '\0' )
{
//将主机的规范名输出
cout << "主机规范名:" << pHostEntry->h_name << endl; //主机别名。可含多个
int i = 0;
for ( i = 1, pptr = pHostEntry->h_aliases; *pptr != NULL; ++pptr )
{
cout << "主机别名" << i++ << ":" << *pptr << endl;
} //将主机地址列表输出,可含多个
char szIpBuff[32] = {0};
for ( i = 1, pptr = pHostEntry->h_addr_list; *pptr != NULL; ++pptr )
{
memset( szIpBuff, 0, sizeof(szIpBuff) );
//inet_ntop的返回值为NULL,则表示失败。否则返回对应的IP地址(此时szIpRet指向的是szIpBuff)
const char* szIpRet = inet_ntop( pHostEntry->h_addrtype, *pptr, szIpBuff, sizeof(szIpBuff) );
if ( szIpBuff != NULL )
{
cout << "解析IP地址" << i++ << ":" << szIpRet << endl;
} } }
else
{
cout << "解析失败。" << endl;
} memset( szHostName, 0, sizeof(szHostName) );
cout << "--------------------------------------" << endl;
cout << "输入域名:";
} WSACleanup();
return 0;
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvczYzNDc3MjIwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">




作者:山丘儿

转载请标明出处,谢谢。原文地址:http://blog.csdn.net/s634772208/article/details/46378223

通过主机名(域名)获取IP地址,主机别名等信息的更多相关文章

  1. linux c 网络编程:用域名获取IP地址或者用IP获取域名 网络地址转换成整型 主机字符顺序与网络字节顺序的转换

    用域名获取IP地址或者用IP获取域名 #include<stdio.h> #include<sys/socket.h> #include<netdb.h> int ...

  2. Oracle LISTENER 主机名修改为IP地址后LISTENER无法监听到实例 oracle监听错误与hosts文件配置

    为什么listener.ora文件里面HOST后面到底应该输入IP地址还是主机名.我的经验告诉我,这边最好使用主机名.很多的时候,一个机器绑定的不只一个IP地址,如HOST后面是IP地址,那么ORAC ...

  3. 通过ping 主机名,或者主机名对应的IP地址

    通过ping 主机名,或者主机名对应的IP地址: 如下图: 懵了吧? 但是你用 ping 主机名 -4

  4. vc根据域名获取IP地址 gethostbyname()函数

    以下是VC Socket初始化时用到的两个函数 一.WSAStartup函数                int WSAStartup                       (         ...

  5. iOS根据域名获取ip地址

    引入头文件 #include <netdb.h> #include <sys/socket.h> #include <arpa/inet.h> //根据域名获取ip ...

  6. 远程拷贝、查看端口、vim常见快捷键、查找替换命令、grep命令、查看存储空间的命令、chkconfig命令、系统自动启动级别、主机名配置、IP地址配置、域名映射、防火墙设置

    2.1.远程拷贝 (将/export/servers/hadoop上的文件拷贝到bigdate@192.168.1.1:/export/servers/ ) scp –r /export/server ...

  7. C# 根据域名获取IP地址

    今天做海康微视视频接口的时候要用到硬盘录像机的IP地址.端口号.用户名和密码. 但是发现客户IP地址是动态获取的,经常变化. 所以需要根据域名解析出IP. 代码如下 //判断输入的是否是IP Rege ...

  8. 根据域名获取ip地址

    1如何查询网站域名对应的ip地址在电脑左下角搜索cmd ,在命令提示符中输入 ping www.pm25.in在电脑左下角搜索运行,输入cmd ,在命令提示符中输入 ping www.pm25.in得 ...

  9. 自定义Nginx日志格式获取IP地址的省市份信息

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6806672112477012493/ 在linux中nginx日志产生的格式是下面的配置: $remote_add ...

  10. 根据域名获取IP地址,并探测是否可达

    /* Author :decwang@2014.09.01 Mail :deworks@sina.com*/#define PRINTLOG printf//返回0表示成功,其他为失败. int ge ...

随机推荐

  1. [Gym101194G][CHINA-Final2016]Pandaria

    题目大意: 给你一个$n(n\le10^5)$个点,$m(m\le2\times10^5)$条边的无向图,每个点有一个颜色$c_i$,每条边有一个边权$w_i$.$q(q\le2\times10^5) ...

  2. 计算数字出现的次数 Exercise07_03

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:计算数字出现的次数 * */ public class Exercise0 ...

  3. iOS中用json接收图片的二进制流

    标题可能说的有点混乱,再好好描述一下我遇到的问题: 我负责做一款App的iOS版本,服务器和Android版本都开发完了.服务器的图片存的不是路径,而是在数据库中的blob流对象,由于要求所有数据都用 ...

  4. iOS使用CoreData实现收藏功能

    一般做收藏都是使用数据库或者归档,使用CoreData实现收藏功能就是没事时练一下,实现大概和数据库差不多. 首先创建一个工具类继承NSObject,在里面实现所需要的方法. 工具类的.h文件: ty ...

  5. CentOS查看主板型号、CPU、显卡、硬盘等信息

    系统 uname -a # 查看内核/操作系统/CPU信息 head -n 1 /etc/issue # 查看操作系统版本 cat /proc/cpuinfo # 查看CPU信息 hostname # ...

  6. C++11简要介绍

    概述  C++1x (本教程中指 C++11/14, 甚至 C++17) 为传统 C++ 注入的大量特性使得整个 C++ 变得更加像一门现代化的语言.C++1x 不仅仅增强了 C++ 语言自身的可用性 ...

  7. 46. Permutations 排列数

    46. Permutations 题目 Given a collection of distinct numbers, return all possible permutations. For ex ...

  8. Java源码阅读PriorityQueue

    1类签名与简介 public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serial ...

  9. Python 转义html中以"&#"开头的字符

    from HTMLParser import HTMLParser print HTMLParser().unescape('中国')

  10. Mysql 中文中繁杂的字 插入报错的 解决方案

    首先 数据库默认编码选用 utf8 连接字符串也相应改成utf8,不能是gb2312