系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、gethostbyname
    • 1、头文件和函数原型
    • 2、作用
    • 3、返回值
  • 二、封装函数获取IP
  • 三、实例
  • 四、总结

前言

在实际项目中,使用到Tcp连接服务器端,考虑到服务器端有可能提供的是IP地址,也有可能提供的是域名,所以就研究了一下如何从域名中获取真实的IP地址。


一、gethostbyname

主要使用到了gethostbyname这个函数,先带大家了解一下:

1、头文件和函数原型

#include <netdb.h>
struct hostent *gethostbyname(const char *hostname);

2、作用

用于返回对应于给定主机名的主机信息。

3、返回值

返回值 struct hostent:

/* Description of data base entry for a single host.  */
struct hostent
{char *h_name;          /* Official name of host.  */char **h_aliases;      /* Alias list.  */int h_addrtype;       /* Host address type.  */int h_length;          /* Length of address.  */char **h_addr_list;        /* List of addresses from name server.  */
#ifdef __USE_MISC
# define    h_addr  h_addr_list[0] /* Address, for backward compatibility.*/
#endif
};

从结构体中可以看到,不止返回IP地址,还返回了一下其他信息,具体含有如下:
h_name:该变量存有官方域名,官方域名代表某一主页,但实际上,一些著名公司的域名并未使用官方域名注册。
h_aliases:可以通过多个域名访问同一主页,同一IP可以绑定多个域名,因此,除官方域名外还可指定其他域名。
h_addrtype:gethostbyname函数不仅支持IPv4,还支持IPv6。因此可以通过此变量获取保存在h_addr_list的IP地址的地址族信息。若是IPv4,则此变量存有AF_INET。
h_length:保存IP地址长度。若是IPv4地址,因为是4个字节,则保存4;若是IPv6,因为是16个字节,故保存16。
h_addr_list:该变量以整数形式保存域名的IP地址。另外,用于访问量较大的网站可能分配多个IP给同一域名,利用多个服务器进行负载均衡,同样可以通过此变量获取IP地址信息。
h_addr:该变量是返回h_addr_list列表中的第一个数据。

二、封装函数获取IP

#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
/*** @brief 判断传入的是域名还是ip地址,如果是域名,就通过域名获取ip地址,如果是ip地址不处理,直接返回 * @param host : 域名或IP地址* @return std::string 获取成功返回IP地址,失败返回空*/
static std::string _GetServerIP(char *host)
{if (host == NULL){return std::string();}struct hostent *pstHostent = NULL;if (inet_addr(host) == INADDR_NONE){if ((pstHostent = gethostbyname(host)) == NULL){return std::string();}char *ipaddr = inet_ntoa(*(struct in_addr *)pstHostent->h_addr);if (ipaddr){return std::string(ipaddr);}}else{return std::string(host);}return std::string();
}

三、实例

#include <arpa/inet.h>
#include <vector>
int main(int argc, char *argv[])
{char host[64] = {0};snprintf(host, sizeof(host), "%s", "www.baidu.com");std::string ipaddr = _GetServerIP(host);printf("ipaddr:%s\n", ipaddr.c_str());return 0;
}

运行结果:ipaddr:110.242.68.3

四、总结

封装的函数可以直接拿过来使用,已经验证了。

C/C++ 通过域名获取服务器真实IP地址相关推荐

  1. 绕过CDN获取服务器真实IP地址

    原文视频 CDN(Content Delivery Network) 内容分发网络.使用户就近获取所需内容,降低网络拥塞,提高响应速度. 网络空间搜索引擎 分析下网站关键元素信息 域名 ip titl ...

  2. 获取客户端真实IP地址

    Java-Web获取客户端真实IP: 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP. 一般分为两种情况: ...

  3. golang 获取客户端真实IP地址

    [Go]获取用户真实的ip地址 用户请求到达提供服务的服务器中间有很多的环节,导致服务获取用户真实的 ip 非常困难,大多数的框架及工具库都会封装各种获取用户真实 ip 的方法,在 exnet 包中也 ...

  4. PHP获取客户端真实IP地址的方法

    php获取客户端IP地址有四种方法,这五种方法分别为 1 2 3 4 REMOTE_ADDR HTTP_CLIENT_IP HTTP_X_FORWARDED_FOR HTTP_VIA REMOTE_A ...

  5. CDN下nginx获取用户真实IP地址

    为什么80%的码农都做不了架构师?>>>    随着nginx的迅速崛起,越来越多公司将apache更换成nginx. 同时也越来越多人使用nginx作为负载均衡, 并且代理前面可能 ...

  6. PHP获取用户真实IP地址

    PHP获取用户真实IP地址 <?phpfunction getRealIpAddr() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip=$_SER ...

  7. java获取网络ip地址_Java获取电脑真实IP地址的示例代码

    /** * @author yins * @date 2018年8月12日下午9:53:58 */ import java.net.Inet4Address; import java.net.Inet ...

  8. 获取服务器的ip地址

    /*** @ClassName IpUtil* @Description TODO* @Author wushaopei* @Date 2019/7/22 10:15* @Version 1.0*/ ...

  9. java获取用户真实IP地址

    /*** 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址.* 可是,如果通过了多级反向代理的话,X-Forwarded ...

最新文章

  1. 英特尔核显自定义分辨率_华为推出两款MateBook D系列笔记本:搭载英特尔11代酷睿...
  2. java中 移位运算_java中关于移位运算符的demo与总结(推荐)
  3. 插入排序 希尔排序 C++
  4. Mr.J--Java基础问题30问
  5. 09 高效的PL/SQL程序设计
  6. 【C++】C++为什么要引入引用这个复合类型?
  7. 决策树算法小结(三) CART原理及代码实现
  8. 根据两点坐标计算两点距离
  9. 520用Java制作一个表白app
  10. AJAX学习(一)AJAX基础
  11. Kafka配置broker映射错误报错Discovered coordinator xxx rack: null
  12. 【error】RuntimeError: size mismatch
  13. linux中安装openoffice
  14. 干货!Labeling Trick: 一个图神经网络多节点表示学习理论
  15. Android WebView 不能弹出alert的对话框
  16. 在计算机英语中memory,memory是什么 memory什么意思
  17. 最简真分数 【辗转相除法】
  18. 字符串转化为json对象和json数组
  19. C之九剑其一——识剑
  20. 【Basic】SVM(支持向量机)分类算法

热门文章

  1. 华为操作系统鸿蒙是linux,华为鸿蒙到底是个什么操作系统?
  2. 世界杯太精彩了,带大家用Python做个足球游戏,边玩游戏边看比赛
  3. openwrt (一)入手
  4. 关于研发效能提升的思考
  5. C++处理点在椭圆上的问题
  6. 【Redash 官方文档】查询-创建和编辑查询
  7. http请求工具详解
  8. 生信可视化(part4)--相关性图
  9. css 科技 边框_CSS3 边框
  10. vue中引入并使用高德地图