博客
关于我
Linux---C语言获取指定网卡的IP地址和MAC地址(16进制)
阅读量:782 次
发布时间:2019-03-24

本文共 3481 字,大约阅读时间需要 11 分钟。

以下是经过优化后的内容:

使用C语言获取网络信息详细解析

本文分别介绍了通过C语言编写一些实用工具,获取网络相关信息的实现方法。包括获取指定域名的IP地址、本机网络接口的MAC地址以及本机IP地址的功能。这将帮助开发者快速了解如何在实际编程中处理网络相关的获取操作。

1. 获取指定域名的IP地址

要实现获取指定域名的IP地址,可以通过以下步骤来编写相应的函数:

#include 
#include
#include
int get_ip_by_domain(const char *domain, char *ip) { struct hostent *hptr; hptr = gethostbyname(domain); if (NULL == hptr) { printf("gethostbyname error for host: %s\n", domain); return -1; } char **pptr = hptr->h_addr_list; while (*pptr != NULL) { if (inet_ntop(hptr->h_addrtype, *pptr, ip, IP_SIZE) != NULL) { return 0; } pptr = *(pptr + 1); } return -1; }

这个函数`get_ip_by_domain`通过调用`gethostbyname`函数来获取指定域名的IP地址。函数首先尝试解析域名,如果成功返回第一个IP地址;如果失败则返回错误代码。

2. 获取本机网络接口的MAC地址

想要获取本机特定网络接口的MAC地址,可以利用C语言中的ioctl控制函数:

#include 
#include
#include
#include
int get_local_mac(const char *eth_inf, char *mac) { int sd; struct ifreq ifr; bzero(&ifr, sizeof(struct ifreq)); sd = socket(AF_INET, SOCK_STREAM, 0); if (sd < 0) { printf("get %s mac address socket create error\n", eth_inf); return -1; } strncpy(ifr.ifr_name, eth_inf, sizeof(ifr.ifr_name) - 1); if (ioctl(sd, SIOCGIFHWADDR, &ifr) < 0) { printf("get %s mac address error\n", eth_inf); close(sd); return -1; } snprintf(mac, MAC_SIZE, "%02x:%02x:%02x:%02x:%02x:%02x", (unsigned char)ifr.ifr_hwaddr.sa_data[0], (unsigned char)ifr.ifr_hwaddr.sa_data[1], (unsigned char)ifr.ifr_hwaddr.sa_data[2], (unsigned char)ifr.ifr_hwaddr.sa_data[3], (unsigned char)ifr.ifr_hwaddr.sa_data[4], (unsigned char)ifr.ifr_hwaddr.sa_data[5]); close(sd); return 0; }

这个函数`get_local_mac`通过在当前网络接口上打开socket,调用`ioctl`函数获取硬件地址(MAC地址),然后将其格式化为十六进制字符串输出。

3. 获取本机IP地址

要获取本机网络接口的IP地址,也可以使用类似的方法:

#include 
#include
#include
#include
int get_local_ip(const char *eth_inf, char *ip) { int sd; struct ifreq ifr; struct sockaddr_in sin; sd = socket(AF_INET, SOCK_DGRAM, 0); if (-1 == sd) { printf("socket error: %s\n", strerror(errno)); return -1; } strncpy(ifr.ifr_name, eth_inf, IFNAMSIZ); ifr.ifr_name[IFNAMSIZ - 1] = 0; if (ioctl(sd, SIOCGIFADDR, &ifr) < 0) { printf("ioctl error: %s\n", strerror(errno)); close(sd); return -1; } memcpy(&sin, &ifr.ifr_addr, sizeof(sin)); snprintf(ip, IP_SIZE, "%s", inet_ntoa(sin.sin_addr)); close(sd); return 0; }

这个函数`get_local_ip`通过在指定网络接口上打开socket,调用`ioctl`获取接口地址(IP地址),然后将其格式化为可读字符串。


扩展1:将MAC地址转换为十六进制字符串

在使用`get_local_mac`函数获取MAC地址后,可以将其转换为十六进制字符串:

unsigned char mac[6] = {0};  char *pchStr = strtok(mac_addr, ":");  int nTotal = 0;  while (NULL != pchStr)  {      mac[nTotal++] = (unsigned char)(*(pchStr + 1) >> 4);      pchStr = strtok(NULL, ":");  }  printf("mac is %02x%02x%02x%02x%02x%02x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

在这个示例中,`mac_addr`是通过`get_local_mac`函数获取的该网络接口的MAC地址。该代码将MAC地址分解为6个字节,并将它们转换为十六进制字符串形式。


扩展2:将char数组赋值给另一个char数组

在某些场景下,可能需要将一个char数组的值赋值给另一个char数组中的指定位置。可以使用`memcpy`函数来实现:

memcpy(chrUDP + 20, mac, 6);

上述代码将`mac`数组的所有值赋值给`chrUDP`数组从位置20开始的后面6个数组元素中。

转载地址:http://rvokk.baihongyu.com/

你可能感兴趣的文章
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>
mysql 状态检查,备份,修复
查看>>