windows下获取IP地址的两种方法;

一种可以获取IPv4和IPv6,但是需要WSAStartup;

一种只能取到IPv4,但是不需要WSAStartup;

如下:

方法一:(可以获取IPv4和IPv6)

 #define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <Winsock2.h>
#include <stdio.h>
#include <iostream>
#include <cstring>
#include<ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib ") //linking to the library
using namespace std;
int get_ip()
{
struct addrinfo *ailist, *aip;
struct addrinfo hint;
struct sockaddr_in6 *sinp6;
PHOSTENT hostinfo;
char hostname[] = {}; //主机名
char *port = ""; //端口号
const char *addr;
int ilRc;
gethostname(hostname, sizeof(hostname));
if((hostinfo = gethostbyname(hostname)) == NULL) //获得本地ipv4地址
{
errno = GetLastError();
fprintf(stderr,"gethostbyname Error:%d\n", errno);
return ;
}
LPCSTR ip;
while(*(hostinfo->h_addr_list) != NULL) //输出ipv4地址
{
ip = inet_ntoa(*(struct in_addr *) *hostinfo->h_addr_list);
printf("ipv4 addr = %s\n\n", ip);
hostinfo->h_addr_list++;
}
hint.ai_family = AF_INET6; //hint 的限定设置
hint.ai_socktype = SOCK_STREAM; //这里可是设置 socket type 比如 SOCK_DGRAM
hint.ai_flags = AI_PASSIVE; // flags 的标志很多。常用的有AI_CANONNAME;
hint.ai_protocol = ; //设置协议 一般为0,默认
hint.ai_addrlen = ; //下面不可以设置,为0,或者为NULL
hint.ai_canonname = NULL;
hint.ai_addr = NULL;
hint.ai_next = NULL;
ilRc = getaddrinfo(hostname, port, &hint, &ailist); //通过主机名获得地址信息
if (ilRc < )
{
char str_error[];
strcpy(str_error, (char *)gai_strerror(errno));
printf("str_error = %s", str_error);
return ;
}
if(ailist == NULL)
{
printf("sorry not find the IP address,please try again \n");
}
for (aip = ailist; aip != NULL; aip = aip->ai_next) //显示获取的信息
{
aip->ai_family == AF_INET6;
sinp6 = (struct sockaddr_in6 *)aip->ai_addr; //为什么是for 循环 ,先向下看
int i;
printf("ipv6 addr = ");
for(i = ; i < ; i++)
{
if(((i-)%) && (i>))
{
printf(":");
}
printf("%02x",sinp6->sin6_addr.u.Byte[i]);
}
printf(" \n");
printf(" \n");
}
while();
}
int main(){ WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( , );
err = WSAStartup( wVersionRequested, &wsaData );//initiate the ws2_32.dll and match the version
if ( err != )
{
return ;
}
if ( LOBYTE( wsaData.wVersion ) != || //if the version is not matched ,then quit and terminate the ws3_32.dll
HIBYTE( wsaData.wVersion ) != )
{
WSACleanup( );
return ;
}
get_ip();
WSACleanup( );
return ;
}

方法二:(只能取到IPv4)

 //#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#include <Iphlpapi.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
//#pragma comment(lib, "ws2_32.lib") int main(int argc, char* argv[])
{
//PIP_ADAPTER_INFO结构体指针存储本机网卡信息
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
//得到结构体大小,用于GetAdaptersInfo参数
unsigned long stSize = sizeof(IP_ADAPTER_INFO);
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
//记录网卡数量
DWORD netCardNum = ;
GetNumberOfInterfaces(&netCardNum);
cout << "网卡数量:" << netCardNum<< endl; netCardNum = 0;
//记录每张网卡上的IP地址数量
int IPnumPerNetCard = ;
if (ERROR_BUFFER_OVERFLOW == nRel)
{
//如果函数返回的是ERROR_BUFFER_OVERFLOW
//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
//这也是说明为什么stSize既是一个输入量也是一个输出量
//释放原来的内存空间
delete pIpAdapterInfo;
//重新申请内存空间用来存储所有网卡信息
pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
}
if (ERROR_SUCCESS == nRel)
{
//输出网卡信息
//可能有多网卡,因此通过循环去判断
while (pIpAdapterInfo)
{
cout << "网卡序号:" << ++netCardNum <<"\t"<<pIpAdapterInfo->Index << endl;
cout << "网卡名称:" << pIpAdapterInfo->AdapterName << endl;
cout << "网卡描述:" << pIpAdapterInfo->Description << endl;
cout << "网卡类型:";
switch (pIpAdapterInfo->Type)
{
case MIB_IF_TYPE_OTHER: cout << "OTHER" << endl; break;
case MIB_IF_TYPE_ETHERNET: cout << "ETHERNET" << endl; break;
case MIB_IF_TYPE_TOKENRING: cout << "TOKENRING" << endl; break;
case MIB_IF_TYPE_FDDI: cout << "FDDI" << endl; break;
case MIB_IF_TYPE_PPP: cout << "PPP" << endl; break;
case MIB_IF_TYPE_LOOPBACK: cout << "LOOPBACK" << endl; break;
case MIB_IF_TYPE_SLIP: cout << "SLIP" << endl; break;
default: cout << "" << endl; break;
}
cout << "网卡MAC地址:";
for (DWORD i = ; i < pIpAdapterInfo->AddressLength; i++)
if (i < pIpAdapterInfo->AddressLength - )
{
printf("%02X-", pIpAdapterInfo->Address[i]);
}
else
{
printf("%02X\n", pIpAdapterInfo->Address[i]);
}
cout << "网卡IP地址如下:" << endl;
IPnumPerNetCard = ;
//可能网卡有多IP,因此通过循环去判断
IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
do
{
cout << "该网卡上的IP数量:" << ++IPnumPerNetCard << endl;
cout << "IP 地址:" << pIpAddrString->IpAddress.String << endl;
cout << "子网掩码:" << pIpAddrString->IpMask.String << endl;
cout << "网关地址:" << pIpAdapterInfo->GatewayList.IpAddress.String << endl;
pIpAddrString = pIpAddrString->Next;
} while (pIpAddrString);
pIpAdapterInfo = pIpAdapterInfo->Next;
cout << "--------------------------------------------------------------------" << endl;
} }
//释放内存空间
if (pIpAdapterInfo)
{
delete pIpAdapterInfo;
}
return ;
}

Linux下,详见:http://www.cnblogs.com/lzpong/p/6956439.html

windows 获取本机(全部)IPv4、IPv6、MAC地址方法 (C/C++)的更多相关文章

  1. Java获取本机的IP与MAC地址

    有些机器有许多虚拟的网卡,获取IP地址时会出现一些意外,所以需要一些验证: // 获取mac地址 public static String getMacAddress() { try { Enumer ...

  2. 获取客户机的ip和mac地址

    只获取clientIP package com.ppms.utils; import javax.servlet.http.HttpServletRequest; /** * Created by l ...

  3. C# 获取本机CPU序列号,MAC地址,硬盘ID,本机IP地址,计算机名,物理内存,PC类型

    首先引入服务 然后 调用 本文转载自http://blog.sina.com.cn/s/blog_7eeb43210101hf7f.html public class Computer { publi ...

  4. windows获取本机MAC地址并写入文件的bat

    windows获取本机MAC地址并写入文件的bat MAC(Media Access Control)地址,或称为 MAC地址.硬件地址,用来定义网络设备的位置. bat代码例如以下: @echo o ...

  5. Linux中获取本机的最新IPv6地址_更新ddns的脚本

    Linux中获取本机的最新IPv6地址_更新ddns的脚本 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-07. 运营商提供ipv6地址. 路由器后有台linux机器,通过e ...

  6. 【转载】获取MAC地址方法大全

    From:http://blog.csdn.net/han2814675/article/details/6223617 Windows平台下用C++代码取得机器的MAC地址并不是一件简单直接的事情. ...

  7. C#获取IP及MAC地址 方法

    C#获取IP及MAC地址 方法,比较齐全 using System.Net; using System; using System.Management; using System.Runtime.I ...

  8. C++获取本机用于连接的IP地址

    最近写个程序需要获取本机用于连接的IP地址,经过很多的尝试后,最终使用的方法如下: 使用cmd命令    netstat  | findstr “192.168.6.66:3333” > D:\ ...

  9. 验证试验 更改了从机CAN通信的MAC地址 从机新挂CAN网络 上电自检通过

    更改前 该之后 主机程序 与 从机 程序 已经上传到网盘上 ,主机和从机程序基本一致, 唯一的区别是 从机更好了MAC地址 为0X10  主机的固定MAC地址为 0X1F 改程序的配置上设置的是双滤波 ...

随机推荐

  1. spring boot: @Retention注解 @Documented 注解 @Inherited 注解

    http://www.jb51.net/article/55371.htm Retention注解 Retention(保留)注解说明,这种类型的注解会被保留到那个阶段. 有三个值:1.Retenti ...

  2. IIS7配置PHP简要说明

    1. IIS7 安装的时候 要注意三个地方打得勾 万维网服务->应用程序开发功能->CGI ->ISAPI扩展 ->ISAPI筛选器 注:   CGI  会在IIS7+PHP_ ...

  3. 利用ChromeOptions()加载用户配置

    一. 如何绕过页面登录 我们在登录网站的时候,通常需要输入用户名.密码和验证码,那么有没有办法绕过登录环节呢? 有两种方法可以解决这个问题,一种是利用chrome浏览器的用户配置,一种是利用cooki ...

  4. mpv 播放器

    https://mpv.io/ Mac版本: 官网: https://mpv.io/ https://mpv.io/installation/ 下载: http://sva.wakku.to/~chr ...

  5. Windows7 如何关闭系统更新

    我们点击开始菜单,找到控制面板这个选项,如图:  然后进入操作中心,如图:  然后选择如图所示的选项,如图:  然后选择更改设置选项,如图:  然后我们选择从不检查更新并点击确定按钮,如图:

  6. URL OpenDocument

    以前用在DASHBOARD 使用URL传参 到webi 报表.还是很多不理解,现在明白多了.于是做个较为详细的记录.尽管dashboard 很快就被淘汰了.也许没什么用.看看也好. 之前的报表,传参都 ...

  7. kylin_异常_02_java.lang.NoClassDefFoundError: org/apache/hadoop/hive/conf/HiveConf 解决办法

    一.异常现象 在kylin的web管理界面,设置hive数据源时,报错: 查找kylin的日志时发现,弹出提示框的原因是因为出现错误: ERROR [http-bio-7070-exec-10] co ...

  8. 201621123014《Java程序设计》第六周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 答: 注1:关键词与内容不求多,但概念之间的联系 ...

  9. APP登录的机制

    1.APP每次发送请求时,都会发送header给服务器,服务器去校验传过来的信息是否正确:校验成功后登录成功,若传入的信息不符合该用户的信息则服务器判断,传给APP登录失败 每次的请求都会传入上图中的 ...

  10. 西瓜书概念整理(chapter 1-2)熟悉机器学习术语

    括号表示概念出现的其他页码, 如有兴趣协同整理,请到issue中认领章节 完整版见我的github:ahangchen 觉得还不错的话可以点个star ^_^ 第一章 绪论 Page2: 标记(lab ...