Linux 获取本机IP、MAC地址用法大全

 //#include <sys/types.h>
#include <ifaddrs.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
//#include <sys/socket.h>
//#include <netinet/in.h>
#include <arpa/inet.h>
void pHx(unsigned char* p,int len){
printf("Hex: ");
for(int i=;i<len;i++){
printf("%02X:",p[i]);
}
printf("\b\n");
}
char* getMac(char* mac,char* dv){
struct ifreq ifreq;
int sock;
if(!mac || !dv)
return mac;
if((sock=socket(AF_INET,SOCK_STREAM,)) <)
{
perror( "socket ");
return mac;
}
strcpy(ifreq.ifr_name,dv);
if(ioctl(sock,SIOCGIFHWADDR,&ifreq) <)
{
perror( "ioctl ");
return mac;
}
pHx((unsigned char*)ifreq.ifr_hwaddr.sa_data,sizeof(ifreq.ifr_hwaddr.sa_data));
sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", //以太网MAC地址的长度是48位
(unsigned char)ifreq.ifr_hwaddr.sa_data[],
(unsigned char)ifreq.ifr_hwaddr.sa_data[],
(unsigned char)ifreq.ifr_hwaddr.sa_data[],
(unsigned char)ifreq.ifr_hwaddr.sa_data[],
(unsigned char)ifreq.ifr_hwaddr.sa_data[],
(unsigned char)ifreq.ifr_hwaddr.sa_data[]);
return mac;
} int main (int argc, const char * argv[])
{
char hname[];
struct hostent *hent;
int i; gethostname(hname, sizeof(hname)); //hent = gethostent();
hent = gethostbyname(hname); printf("hostname: %s\n", hent->h_name);
//----------------------------------------------------------
printf("\n\n"); char mac[];
struct ifaddrs * ifap0=NULL,*ifap=NULL;
void * tmpAddrPtr=NULL; getifaddrs(&ifap0);
ifap=ifap0;
while (ifap!=NULL) {
if (ifap->ifa_addr->sa_family==AF_INET) { // check it is IP4
// is a valid IP4 Address
tmpAddrPtr=&((struct sockaddr_in *)ifap->ifa_addr)->sin_addr;
char addressBuffer[INET_ADDRSTRLEN];
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
if(strcmp(addressBuffer,"127.0.0.1")!=){
printf("%s IPv4: %s\n", ifap->ifa_name, addressBuffer);
printf("MAC: %s\n\n",getMac(mac,ifap->ifa_name));
}
} else if (ifap->ifa_addr->sa_family==AF_INET6) { // check it is IP6
// is a valid IP6 Address
tmpAddrPtr=&((struct sockaddr_in *)ifap->ifa_addr)->sin_addr;
char addressBuffer[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
if(strcmp(addressBuffer,"::")!=){
printf("%s IPv6: %s\n", ifap->ifa_name, addressBuffer);
printf("MAC: %s\n\n",getMac(mac,ifap->ifa_name));
}
}
ifap=ifap->ifa_next;
}
if (ifap0) { freeifaddrs(ifap0); ifap0 = NULL; }
return ;
}

输出:

hostname: localhost

eth0 IPv4: 192.168.42.2
MAC: 02:42:c0:a8:2a:02 eth0 IPv6: 0:0:fe80::42:c0ff
MAC: 02:42:c0:a8:2a:02

(更多参考:Linux 获取本机IP、MAC地址用法大全)

  

windows下,详情见:http://www.cnblogs.com/lzpong/p/6137652.html

[记]WIndow/Linux 获取本机(全部)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. Linux中获取本机的最新IPv6地址_更新ddns的脚本

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

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

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

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

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

  7. linux下修改MAC地址方法

    一.修改MAC地址方法linux环境下:需要用 #ifconfig eth0 down 先把网卡禁用 再用ifconfig eth0 hw ether 1234567890ab 这样就可以改成功了要想 ...

  8. Linux修改MAC地址方法

    Linux修改MAC地址方法 - Linux modifies MAC address method ifconfig wlan0 down ifconfig wlan0 hw ether MAC地址 ...

  9. linux/Centos下查看和修改网卡Mac地址(ifconfig命令)

    本文转载自http://www.169it.com/article/14360294838474691537.html linux/Centos下查看网卡Mac地址,输入命令: #ifconfig - ...

随机推荐

  1. ngRx 官方示例分析 - 4.pages

    Page 中通过构造函数注入 Store,基于 Store 进行数据操作. 注意 Component 使用了 changeDetection: ChangeDetectionStrategy.OnPu ...

  2. jsp页面中的$(param.xxx)

    $(param.user)相当于<%=request.getParameter("user")%> $(paramValues.favorites[0])相当于< ...

  3. Java数据持久层框架 MyBatis之API学习四(xml配置文件详解)

    摘录网址: http://blog.csdn.net/u010107350/article/details/51292500 对于MyBatis的学习而言,最好去MyBatis的官方文档:http:/ ...

  4. .NET: 谈谈共享项目 (Shared Project) 的使用

    从 Visual Studio 2015 起,共享项目 (Shared Project) 作为新的一种项目类型被添加到项目模板列表中,它的主要目的是使多个不同类型的项目之间可以共享代码或资源.相比它的 ...

  5. CSS深入理解学习笔记之float

    1.float的历史 float设计的初衷仅仅是为了文字环绕效果. 示例代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...

  6. wstring操作与普通段字符操作对照表

    字符分类:   宽字符函数普通C函数描述   iswalnum()   isalnum()   测试字符是否为数字或字母   iswalpha()   isalpha()   测试字符是否是字母    ...

  7. linkinFrame--测试项目添加git管理

    OK,前面一篇博客,已经搭建好了项目的基础的结构.现在我们添加一个简单的servlet来测试下项目能不能跑,然后在讲项目添加到coding上用git管理. 1,我们编写一个servlet,编写一个js ...

  8. 基于jsmpeg库下使用ffmpeg创建视频流连接websocket中继器传输视频并播放

    这个功能的基本工作是这样的: 1.使用node运行jsmpeg库下的websocket-relay.js文件,这个文件的作用是创建一个websocket视频传输中继器 2.运行ffmpeg,将输出发送 ...

  9. AQS 框架之 LockSupport 线程阻塞工具类

    ■ 前言 并发包一直是 JDK 里面比较难理解的,同时也是很精美的语言,膜拜下 Doug Li 大神.作者不敢长篇大论,只求循序渐进地把并发包通过理论和实战 (代码) 的方式介绍给大家. 其实做每一件 ...

  10. docker入门(二)容器与镜像的关系

    [编者的话]本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(co ...