tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下:

10.0.0.0/8:10.0.0.0~10.255.255.255
172.16.0.0/12:172.16.0.0~172.31.255.255
192.168.0.0/16:192.168.0.0~192.168.255.255

使用保留地址的网络只能在内部进行通信,而不能与其他网络互连。如果要与外部通信,那么必须通过网关与外部通信,这里使用了NAT, NAPT技术就是用来保证通信的代理机制。

另外,一些宽带运营商尽管也使用了非私有地址分配给用户使用,但是由于路由设置的原因,Internet上的其他用户并不能访问到这些ip。上面2部分IP都可称为内网IP,下面这部分IP不列入本次讨论范围。

如果自己机器上网络接口的ip地址落在上述保留地址的范围内,则可以肯定自己处于内网模式下。

NAT要求整个服务的连接是从内网向外网主动发起的,而外网的用户无法直接(主动)向内网的服务发起连接请求,除非在NAT的(所有)网关上针对服务的端口作了端口映射。NAT方式要求最外围的网关至少有一个公网的IP,可以访问显IP的外部服务器如:http://ipid.shat.net/ 获取到外部IP,将这个IP与自己机器上网络接口的ip比较,即可知道自己的ip是不是内网IP。

判断自己IP类型,可使用下面三种任意一种方法:

1)     在windos命令台程序下,用ipconfig

Eg: 下面内网IP是192.168.0.1,外网IP是125.34.47.25,因此是网关。

C:/Documents and Settings/user>ipconfig

Windows IP Configuration

Ethernet adapter 本地连接:

Connection-specific DNS Suffix . :

IP Address. . . . . . . . . . . . : 192.168.0.1

Subnet Mask . . . . . . . . . . . : 255.255.255.0

Default Gateway . . . . . . . . . : 192.168.0.1

Ethernet adapter {6C8AEC26-0EC3-40FE-812E-A46778ECA752}:

Media State . . . . . . . . . . . : Media disconnected

PPP adapter 宽带拨号:

Connection-specific DNS Suffix . :

IP Address. . . . . . . . . . . . : 125.34.47.25

Subnet Mask . . . . . . . . . . . : 255.255.255.255

Default Gateway . . . . . . . . . : 125.34.47.25

2)   用tracert来判断IP类型

如果第一个hops不是内网IP,那么自己就是外网IP了,反之,如果自己是内网IP,那么第一个hops显示的就是网关的内网IP,下面的例子显然说明是外网IP了。

C:/Documents and Settings/user>tracert www.baidu.com

Tracing route to www.a.shifen.com [202.108.22.5]

over a maximum of 30 hops:

1    15 ms    16 ms    14 ms 125.34.40.1

2   14 ms     *        *     61.148.8.9

3    26 ms    72 ms    40 ms xd-22-5-a8.bta.net.cn [202.108.22.5]

Trace complete.

3)编程实现

获取到本机所有的IP地址列表,对IP列表进行分析:

1) 如果列表中只有局域网IP,那么说明是在内网;

2) 如果列表中有局域网IP,也有公网IP,那么说明是网关;

3) 如果列表中只有公网IP,那么说明是独立IP。

//此处不考虑其它平台,在inet架构下测试, 输入的ip为主机字节顺序

// 0xa -- "10.0.0.0">>24; 0xc0a8--"192.168.0.0.">>16; 0x2b0--"127.17.0.1">>22

int isInnerIP( uint32_t a_ip ){int bValid = -1;if( (a_ip>>24 == 0xa) || (a_ip>>16 == 0xc0a8) || (a_ip>>22 == 0x2b0) ){bValid = 0;}return bValid;}int isInnerIP( char* a_strip ){return 0;}

IP相关的应用

//获取到本机所有的IP地址列表,并分别用字符串与整形形式来显示

int getHostIP()       //return int{struct sockaddr_in localAddr, destAddr;struct hostent* h;char temp[128];int nRect = gethostname(temp, 128);printf("ipaddr src3 is: %s/n", temp);if(nRect !=0){printf("error");}h = gethostbyname(temp);if(h){for(int nAdapter=0; h->h_addr_list[nAdapter]; nAdapter++){memcpy(&destAddr.sin_addr.s_addr, h->h_addr_list[nAdapter], h->h_length);// 输出机器的IP地址.printf("Address string: %s/n", inet_ntoa(destAddr.sin_addr)); // 显示地址串printf("Address int: %d/n", destAddr.sin_addr.s_addr); // 转化为整形数字}}return     0;}

//检查字符串IP是否合法

int isCheckTrue(char* strip){int value;for( int i = 0; i < strlen(strip); i++){// let's check if all entered char in entered// IP address are digitsif(strip[i] == '.')continue;if(isdigit(strip[i]) == 0){return -1;}}return 0;}//将字符串IP转化为整形IPint str2intIP(char* strip) //return int ip{int intIP;if(!(intIP = inet_addr(strip))){perror("inet_addr failed./n");return -1;}return intIP;}

【参考】:什么是外网IP和内网IP? - 知乎

如何判断自己IP是内网IP还是外网IP相关推荐

  1. 公网域名如何解析到内网IP服务器——快解析域名映射外网访问

    在本地搭建主机应用后,由于没有公网IP或没有公网路由权限,在需要发布互联网时,就需要用到外网访问内网的一些方案.由于内网IP在外网不能直接访问,通常就用通过外网域名来访问内网的方法.那么,公网域名如何 ...

  2. 无需公网IP,内网穿透实现外网远程桌面办公 3-3

      系列文章 无需公网IP,内网穿透实现外网远程桌面办公 1-3 无需公网IP,内网穿透实现外网远程桌面办公 2-3 无需公网IP,内网穿透实现外网远程桌面办公 3-3 上一篇: 无需公网IP,内网穿 ...

  3. 无需公网IP,内网穿透实现外网远程桌面办公 2-3

     系列文章 无需公网IP,内网穿透实现外网远程桌面办公 1-3 无需公网IP,内网穿透实现外网远程桌面办公 2-3 无需公网IP,内网穿透实现外网远程桌面办公 3-3 上一篇:  无需公网IP,内网穿 ...

  4. Retrofit用Interceptor实现内外网接口自动切换访问(在内网IP访问失败的时候.访问外网接口)

    Retrofit用Interceptor实现内外网接口自动切换访问(在内网IP访问失败的时候.访问外网接口) 主要项目里面需求有2个baseurl,必须要能够根据用户的网络状况进行baseurl的重新 ...

  5. USG防火墙------内外网用户通过外网IP访问内部服务器(NAT)

      实现需求:用户通过内外网用户通过公网IP访问内部服务器. 一.局域网配置:交换机(SW7).防火墙(FW3).服务器(Server1).客户端(Client1) 二.配置思路 1.配置防火墙接口和 ...

  6. 多网卡下如何配置指定IP走某个路由器(适用于外网不通,但是钉钉服务器通的情况)...

    # 多网卡下如何配置指定IP走某个路由器(适用于外网不通,但是钉钉服务器通的情况) ## 如何查看一个进程建立的网络连接,方式一 - 查看进程pid `ps -ef|grep dingtalk` - ...

  7. linux内网机器访问外网代理设置squid

    linux内网机器访问外网代理设置squid 公司一般出于安全考虑, 在同一局域网中只有一台机器可以访问外网,运维进行了整体的限制, 但是在后面的工作中,需要在机器上安装一些软件,及命令,所以其他的机 ...

  8. iptables 实现centos内网机器访问外网

    环境:一台带外网和内网的机器,另一台只有内网,默认不能上网.两台机器都是centos系统 带外网机器的外网ip为 123.221.20.11, 内网ip为 192.168.15.100 内网机器的内网 ...

  9. 配置内网邮件和外网邮件互发

    配置内网邮件服务器和外网邮件服务器互发邮件 邮件系统的主要功能是传递邮件,使用户通过电子邮件来交流彼此的信息,邮件传输功能决定了邮件的处理和传递方式.Exchange 2007的管理员可以通过配置中心 ...

  10. MTK_android11_WIFI(内网)和4G(外网)共存

    一.思路 所谓共存就是让两个网络同时使用,如果想让哪个网络作为外网,则该网络优先级要高于内网的网络,即可达到外网用来上网的需求,那么要想共存,就必须到从低优先级网络切换到优先级高的网络时,不要做断开操 ...

最新文章

  1. python基于条件、规则构建已有字典的子集
  2. OSError: libcudart.so.8.0: cannot open shared object file: No such file or directory 解决方法
  3. 【图像分类】 标签噪声对分类性能会有什么样的影响?
  4. VTK:循环布尔PolyData用法实战
  5. alert获取输入框内容_获取由 AlertDialog 生成的对话框中EditText的文本内容
  6. Python:Numpy库中的invert()函数的用法
  7. 用crontab、crond在嵌入式系统中添加定时任务
  8. Linux中命令行终端切换工具screen
  9. 根据后缀名/扩展名获取content-type/Mime类型
  10. 计算机算法专业英语,计算机算法英语常用术语
  11. 小森生活服务器维护到几点,小森生活几点开服上线 2021小森生活开服表大全[多图]...
  12. 使用python爬取电影下载地址并使用transmissionrpc下载
  13. 假如生活欺骗了你……——网上答疑(14)
  14. js进阶 发送短信案例 自动跳转页面
  15. x86下编译龙芯JDK8(一)
  16. 如何在Windows系统上下载并安装IBM磁带驱动程序
  17. 租用云主机需要注意哪些因素
  18. 教你用Python爬取动态加载的数据
  19. Android9.0 系统源码编译
  20. C语言--日期问题(黑色星期五问题)

热门文章

  1. 何炅机器人对话_何炅和黄磊的一段对话,暗藏他们对人生的沉淀,听懂后受益一生...
  2. 使用 Django 实现私有云盘
  3. 为什么你招不到合适的猎头顾问?浅谈猎企内部招聘
  4. 使用postman测试上传图片接口
  5. web前端学习笔记:初识Web前端开发
  6. 摩尔线程与Ampere Computing达成合作
  7. Class6——筛选后显示+scipy色彩聚类
  8. 3.17 inappropriateintimacy (狎昵关系)
  9. openpyxl创建excel工作表
  10. c# forbidden.html,C#Web API方法返回403 Forbidden