C/C++ 获得公网ip地址和内网ip

获得公网ip:


bool getPublicIp(string& ip)
{
    int    sock;
    char **pptr = NULL;
    struct sockaddr_in    destAddr;
    struct hostent    *ptr = NULL;
    char destIP[128];

    sock = socket(AF_INET,SOCK_STREAM,0);
    if( -1 == sock ){
        perror("creat socket failed");
        return false;
    }
    bzero((void *)&destAddr,sizeof(destAddr));
    destAddr.sin_family = AF_INET;
    destAddr.sin_port = htons(80);
    ptr = gethostbyname("www.ip138.com");
    if(NULL == ptr){
        perror("gethostbyname error");
        return false;
    }
    for(pptr=ptr->h_addr_list ; NULL != *pptr ; ++pptr){
        inet_ntop(ptr->h_addrtype,*pptr,destIP,sizeof(destIP));
        printf("addr:%s\n",destIP);
        ip = destIP;
        return true;
    }
    return true;
}

获得内网ip:

int getlocalip(char* outip)
{
#ifndef WIN32
	int i=0;
	int sockfd;
	struct ifconf ifconf;
	char buf[512];
	struct ifreq *ifreq;
	char* ip;
	//初始化ifconf
	ifconf.ifc_len = 512;
	ifconf.ifc_buf = buf;
	strcpy(outip,"127.0.0.1");
	if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0)
	{
		return -1;
	}
	ioctl(sockfd, SIOCGIFCONF, &ifconf);    //获取所有接口信息
	close(sockfd);
	//接下来一个一个的获取IP地址
	ifreq = (struct ifreq*)buf;
	for(i=(ifconf.ifc_len/sizeof(struct ifreq)); i>0; i--)
	{
		ip = inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr);

		if(strcmp(ip,"127.0.0.1")==0)  //排除127.0.0.1,继续下一个
		{
			ifreq++;
			continue;
		}
	}
	strcpy(outip,ip);
	return 0;
#else
	return 0;
#endif

}
时间: 2024-11-02 22:31:58

C/C++ 获得公网ip地址和内网ip的相关文章

Java 判断IP地址为内网IP还是公网IP

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 那么,直接上代码吧: public static boolean internalIp(String ip) { byte[] addr = IPAddressUtil.textToNu

H3C SecPath U200-S 如何在内网使用外网IP地址访问内网服务器

H3C SecPath U200-S 如何在内网使用外网IP地址访问内网服务器 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 这个问题很经典的,防火墙上显然配置了NAT的方式进行了转换,但是内部用户在访问的

C#获取本地IP地址,内网+外网方法

1 #region 获取内.外网Ip 2 3 /// <summary> 4 /// 获取本地ip地址,优先取内网ip 5 /// </summary> 6 public static String GetLocalIp() 7 { 8 String[] Ips = GetLocalIpAddress(); 9 10 foreach (String ip in Ips) if (ip.StartsWith("10.80.")) return ip; 11 for

Azure PowerShell (11) 使用自定义虚拟机镜像模板,创建Azure虚拟机并绑定公网IP(VIP)和内网IP(DIP)

<Windows Azure Platform 系列文章目录> 前提要求: 1.假设笔者捕获一个Azure虚拟机模板,命名为leistorage 关于Azure虚拟机模板,请参考下图: 2.在Azure PowerShell,执行以下内容: #选择当前订阅 add-azureaccount -environment azurechinacloud #选择当前存储账号,步骤略 Set-AzureSubscription -SubscriptionName '[SubscriptionName]'

公网IP和内网IP分别在哪里?NAT转换又是什么鬼?

一.引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别在哪里?又有什么关系呢?另外,内行都知道,提到外网IP和内网IP就不得不提NAT路由转换这种东西,那这又是什么鬼?本文就来简单讲讲这些到底都是怎么回事. 二.每台电脑都必须要一个公网IP吗? 答案:不是. 我们都知道,IPv4中的IP地址的数量是有限的(所以现在都在搞IPv6嘛),每次把一部分地址分配出去,那么就意味着能够用来分配的IP地址就更少了,而且随着现在手机,电脑等

推断给定的IP地址是否是内网IP

/** * 推断给定的IP地址是否是内网IP * * @author GaoHuanJie */ public class Test{ public boolean isInnerIP(String ipAddress){/*推断是否是内网IP*/ boolean isInnerIp = false;//默认给定IP不是内网IP long ipNum = getIpNum(ipAddress); /** * 私有IP:A类 10.0.0.0 -10.255.255.255 * B类 172.16

公网IP与内网IP,私家车与公交车,两者体验大不同!

“提速降费”已经喊了很多年,很多用户家里都升级安装了百兆甚至千兆宽带,再也不会出现一人看电影,全家缓冲的情况了. 但大家都知道,每个宽带账号都会分配一个公网IP地址.公网IP地址不是无限的,宽带发展到今天,公网IP地址也已逐渐告罄.于是,近几天很多网民都在抱怨:“自家的公网IP,被偷偷换为内网IP”. 公网IP和内网IP的使用体验有哪些不同?如何获得公网IP? 路由器只需一个公网IP就可以供下面多个电脑联网使用.由于不同的内网IP能够重复使用.所以内网IP通常有以下类型:10.0.0.0~10.

外网IP地址 内网 IP

外网IP地址 大部分网络使用B类或C类地址,每一个类的第一个八位组的范围如下: 1.0-—127.A类 网络号码范围是 0.0.0.0---127.0.0.0 ,用于128个网络.但网络不能全由0组成且127.0.0.0保留用于回路.剩下的126个网络,1到126,共有16777214个可能的主机地址(16777216减2) A类 网络 —主机—主机—主机 0-127 127 0 0 0 2.128—191.B类,网络号码范围是128.0.0.0--191.254.0.0 用于16256个网络.

如何判断自己IP是内网IP还是外网IP

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技术就是用来保证通信的代理机制. 另外,一些宽带