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 digits
              if(strip[i] == '.')
                     continue;
 
              if(isdigit(strip[i]) == 0)
              {
                     return -1;
              }
       }
       return 0;
}
//将字符串IP转化为整形IP
int 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的更多相关文章

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

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

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

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

  3. openvpn实现内网 映射到 外网

    openvpn实现内网 映射到 外网 场景介绍: 机器介绍 本地一台Ubuntu服务器A , 处于内网中 , 无外网IP 外网一台Ubuntu服务器B , 外网地址139.199.4.205 目标 : ...

  4. 用iptables做NAT代理,使内网机器上外网

    现状:服务器A只有一个内网IP,不能上外网,内网IP与服务器B内网相通:服务器B有一个内网IP和公网IP.想实现服务器A也能上外网. 1 2 3 4 服务器A:内网网卡:eth0 内网IP:192.1 ...

  5. 【C#】C#获取本地的内网(局域网)和外网(公网)IP地址的方法

    1.获取本机的IP地址集合: /// <summary> /// 获取本机所有ip地址 /// </summary> /// <param name="netT ...

  6. dubbo调用外网接口 注册外网ip到zookeeper 暴露外网ip

    dubbo注册时会通过主机名寻找ip,会将内网ip注册到zookeeper 如果我们调用外网服务器server的话是找不到的 会报如下错误 [DUBBO] client reconnect to 12 ...

  7. frp内网 穿透映射使内网svn可外网访问

    起因 公司svn目前部署在内网服务器上,现在想在家中也可以使用,因此需要外网访问内网的工具 经过 使用过几个产品: utools,一个小巧的windows下的工具,内网映射只是它的一个小功能,支持tc ...

  8. windows 双网卡同时上专网(内网)和外网

    本操作是用网线做专网(内网),无线网卡用于外网 1. 记录有线网卡的网络的网关,例如10.103.14.1 2. 有线网卡必须是手动指定的ip地址,把网关清掉,例如 3. 删除0.0.0.0 路由 r ...

  9. 〖Network〗宿舍配置两路由器,同时访问校园内网和校园外网

    环境: 校园宿舍, 10.x.x.x 和 172.16.x.x~172.31.x.x是校园内网,本科教务系统什么的都在上边 路由器: 路由器1(校园内网):水星MR807 路由器2(拨号上网):TP ...

  10. 内网gitlab访问外网

     外网要访问内网,内网出口必须有公网ip,且外网访问内部网络可以用花生壳,可以用主机端口映射  写ansible调api,打通内网到阿里云的master节点   如何将公司内网与云服务器内网打通 参照 ...

随机推荐

  1. POJ-3169 Layout 最短路 差分约束

    题目链接:https://cn.vjudge.net/problem/POJ-3169 题意 Farmer John手下的一些牛有自己喜欢的牛,和讨厌的牛 喜欢的牛之间希望距离在给定距离D之内 讨厌的 ...

  2. 第五周-磁盘分区GPT、shell脚本练习、lvm详解

    1. 描述GPT是什么,应该怎么使用 Linux中磁盘分区分为MBR和GPT. MBR全称为Master Boot Record,为主引导记录,是传统的分区机制,应用于绝大多数使用的BIOS的PC设备 ...

  3. 【BZOJ 1303】 [CQOI2009]中位数图

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 注意是1..n的排列. 设b的位置为i. 设i右边的数字,比b大的为1,比b小的为-1. (i左边的位置数字也一样设置成1和-1 则 ...

  4. elasticsearch中的几个概念总结

    1.Geo spatial search : 地理空间搜索,可以在搜索查询中指定的某一距离内查找所要的内容.也可以返回以当前为圆心,逐渐添加圆的半径.直到找到所匹配到的内容. 參考:http://ww ...

  5. linux+apache+mysql+php平台构建及环境配置

    1.我使用的centos6.安装时已经选择安装apach.mysql,事实上在运行下列两行命令的时候又对其进行了更新.所以说装的时候能够不安装,免得浪费时间. yum install php-mysq ...

  6. server问题排查经常使用命令

    1.top 查看系统负载情况,load average CPU使用情况,按1查看每一个CPU的使用情况 shift+h  查看每一个线程的情况 2.free -m   按兆为单位输出内存的已用,未用. ...

  7. bzoj2438: [中山市选2011]杀人游戏(强联通+特判)

    2438: [中山市选2011]杀人游戏 题目:传送门 简要题意: 给出n个点,m条有向边,进行最少的访问并且可以便利(n-1)个点,求这个方案成功的概率 题解: 一道非常好的题目! 题目要知道最大的 ...

  8. Metasploit渗透测试实验报告

    Metasploit渗透测试实验报告

  9. ByteArray的操作总结(复制、打印、位运算)

    1. 字节数组的复制 Method A:Array.Clone() Clone返回的是Object对象,需要强类型转换:Clone会创建一个新的对象,并将value赋给dec ]; ]; dst = ...

  10. Unity C# 设计模式(四)抽象工厂模式

    定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构. 抽象工厂模式使用同一个 工厂等级结构负责这 ...