博客
关于我
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 Workbench 使用手册:从入门到精通
查看>>
MySQL Workbench 数据库建模详解:从设计到实践
查看>>
MySQL Workbench 数据建模全解析:从基础到实践
查看>>
mysql workbench6.3.5_MySQL Workbench
查看>>
MySQL Workbench安装教程以及菜单汉化
查看>>
MySQL Xtrabackup 安装、备份、恢复
查看>>
mysql [Err] 1436 - Thread stack overrun: 129464 bytes used of a 286720 byte stack, and 160000 bytes
查看>>
MySQL _ MySQL常用操作
查看>>
MySQL – 导出数据成csv
查看>>
MySQL —— 在CentOS9下安装MySQL
查看>>
MySQL —— 视图
查看>>
mysql 不区分大小写
查看>>
mysql 两列互转
查看>>
MySQL 中开启二进制日志(Binlog)
查看>>
MySQL 中文问题
查看>>
MySQL 中日志的面试题总结
查看>>
mysql 中的all,5分钟了解MySQL5.7中union all用法的黑科技
查看>>
MySQL 中的外键检查设置:SET FOREIGN_KEY_CHECKS = 1
查看>>
Mysql 中的日期时间字符串查询
查看>>
mysql 中索引的问题
查看>>