使用函数getifaddrs来枚举网卡IP,当中使用到的结构体例如以下所看到的:

struct ifaddrs
{ struct ifaddrs  *ifa_next;    /* Next item in list */ char            *ifa_name;    /* Name of interface */ unsigned int     ifa_flags;   /* Flags from SIOCGIFFLAGS */ struct sockaddr *ifa_addr;    /* Address of interface */ struct sockaddr *ifa_netmask; /* Netmask of interface */ union { struct sockaddr *ifu_broadaddr; /* Broadcast address of interface */ struct sockaddr *ifu_dstaddr; /* Point-to-point destination address */ } ifa_ifu; #define              ifa_broadaddr ifa_ifu.ifu_broadaddr #define              ifa_dstaddr   ifa_ifu.ifu_dstaddr void            *ifa_data;    /* Address-specific data */
}; 

ifa_next指向链表的下一个成员。

ifa_name是接口名称,以0结尾的字符串。比方eth0,lo;

ifa_flags是接口的标识位(比方当IFF_BROADCAST或IFF_POINTOPOINT设置到此标识位时,影响联合体变量ifu_broadaddr存储广播地址或ifu_dstaddr记录点对点地址);

ifa_netmask存储该接口的子网掩码。结构体变量存储广播地址或点对点地址(见括弧介绍ifa_flags);

ifa_data存储了该接口协议族的特殊信息,它一般是NULL(一般不关注他)。

函数getifaddrs(int getifaddrs (struct ifaddrs **__ifap))获取本地网络接口信息,将之存储于链表中,链表头结点指针存储于__ifap中带回,函数执行成功返回0,失败返回-1,且为errno赋值。

编程实现本机IP地址获取:

#include <stdio.h>
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>int main (int argc, const char * argv[]) {struct ifaddrs * ifAddrStruct=NULL;struct ifaddrs * ifa=NULL;void * tmpAddrPtr=NULL;getifaddrs(&ifAddrStruct);for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {if (ifa ->ifa_addr->sa_family==AF_INET) { // check it is IP4// is a valid IP4 AddresstmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;char addressBuffer[INET_ADDRSTRLEN];inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); } else if (ifa->ifa_addr->sa_family==AF_INET6) { // check it is IP6// is a valid IP6 AddresstmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;char addressBuffer[INET6_ADDRSTRLEN];inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); } }if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct);return 0;
}

在server上执行,获得的结果例如以下图:

转载于:https://www.cnblogs.com/ldxsuanfa/p/10847719.html

Linux编程获取本机IP地址相关推荐

  1. linux编程获取本机IP地址的三种方法

    这是一项不太清晰而且没有多大意义的工作.一个原因是网络地址的设置非常灵活而且都是允许用户进行个性化设置的,比如一台计算机上可以有多块物理网卡或者虚拟网卡,一个网卡上可以绑定多个IP地址,用户可以为网卡 ...

  2. (转载)Linux编程获取本机IP地址的三种方法

    (转载)http://blog.csdn.net/jcwKyl/article/details/6324147 这 是一项不太清晰而且没有多大意义的工作.一个原因是网络地址的设置非常灵活而且都是允许用 ...

  3. linux获取本机IP地址

    转自:http://blog.csdn.net/bailyzheng/article/details/7489656 ifaddrs结构体定义如下: C代码   struct ifaddrs { st ...

  4. qt获取本机全部ipv4_QT5下获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址...

    获取主机名称 /* * 名称:get_localmachine_name * 功能:获取本机机器名称 * 参数:no * 返回:QString */ QString CafesClient::get_ ...

  5. Shell脚本中获取本机ip地址,Linux获取本地ip地址

    在 Shell 脚本中获取本机 IP 地址可以通过多种方式实现,这里介绍三种常用的方法: 1. 使用 ifconfig 命令获取本机 IP 地址 ifconfig 命令可以获取本机网卡的配置信息,包括 ...

  6. Linux下 shell获取本机ip地址

    方法二 /sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6 | awk '{print $2}' | tr -d "add ...

  7. python获取本机 ip地址、mac地址(物理地址)、计算机名、硬盘序列号、CPU序列号、主板序列号、bios序列号、bios uuid号

    文章目录 python获取本机IP地址.mac地址(物理地址).计算机名 物理地址 计算机名.ip地址 硬盘序列号 CPU序列号 主板序列号 bios序列号 bios uuid号 python获取本机 ...

  8. 快速获取本机IP地址AWK功能

    有些时候,我们在应用中可能要用到通过linux命令来获取本机IP地址,方法有很多种,例如最常见的就是ifconfig 如果我想尽尽只获取IP地址,方法也有很多种 例如:获取eth0的IP信息,利用cu ...

  9. python 获取本机IP地址

    方法一: 通常使用socket.gethostbyname()方法即可获取本机IP地址,但有时候获取不到(比如没有正确设置主机名称),示例代码如下: import socket# 获取本机计算机名称 ...

最新文章

  1. Python模块-创建和执行程序(或者脚本)
  2. 算法 - 选择排序(C#)
  3. android fragment 生命周期
  4. 从零开始系统化学Android,值得收藏!
  5. php打补丁,PHPMailer库打补丁后漏洞仍然存在,怎么解?
  6. 视频: 电子制作基本知识
  7. ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory解决方案
  8. C#学习笔记——.NET
  9. CenterOs git安装
  10. kindle我的剪帖文件整理脚本
  11. 第九届山东理工大学ACM网络编程擂台赛 F题题解
  12. PQ 8.05中文版硬盘物理分区与删除分区(图文详解)
  13. oracle定时器每天下午6点_强力巨彩冠名!6月23日下午15点直播抢先看
  14. ubuntu各种实践笔记
  15. WEBGUI中上一页(PgUp/Page Up)和下一页(PgDn/Page Down)键不起效
  16. Android -- 传感器使用示例, 用方向传感器做指南针
  17. android apk汉化与破解
  18. VirtualBox“切换到无缝模式”和“自动调整显示尺寸”菜单无法使能
  19. POJ2987 Firing
  20. 快手一夜“10台春晚”背后,未来市值或超千亿美金

热门文章

  1. java 军工_为什么军工行业不用java而是选择继续用c(对于业务系统Java是非常合适的而不带操作系统的板子甚至可以做到微秒级别的实时控制)...
  2. 简述python调试程序_简单调试 Python 程序
  3. 第一章节 初识C#程序
  4. 1008 数组元素右移k位
  5. Python入门--列表元素的判断及遍历,判断指定元素在列表中是否存在,列表元素的遍历,
  6. [leetcode]1185. 一周中的第几天
  7. OpenGL基础44:光照矫正(上)
  8. Unity3D基础42:AnyState大法
  9. bzoj 1295: [SCOI2009]最长距离(SPFA)
  10. opencv 图像读写显示、matplotlib 库图像读写显示