博客
关于我
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:避免重复的插入数据方法汇总
查看>>
MyS中的IF
查看>>
M_Map工具箱简介及地理图形绘制
查看>>
m_Orchestrate learning system---二十二、html代码如何变的容易
查看>>
M×N 形状 numpy.ndarray 的滑动窗口
查看>>
m个苹果放入n个盘子问题
查看>>
n = 3 , while n , continue
查看>>
n 叉树后序遍历转换为链表问题的深入探讨
查看>>
N!
查看>>
N-Gram的基本原理
查看>>
n1 c语言程序,全国青少年软件编程等级考试C语言经典程序题10道七
查看>>
Nacos Client常用配置
查看>>
nacos config
查看>>
Nacos Config--服务配置
查看>>
Nacos Derby 远程命令执行漏洞(QVD-2024-26473)
查看>>
Nacos 与 Eureka、Zookeeper 和 Consul 等其他注册中心的区别
查看>>
Nacos 单机集群搭建及常用生产环境配置 | Spring Cloud 3
查看>>
Nacos 启动报错[db-load-error]load jdbc.properties error
查看>>
Nacos 报Statement cancelled due to timeout or client request
查看>>
Nacos 注册服务源码分析
查看>>