本文共 3481 字,大约阅读时间需要 11 分钟。
以下是经过优化后的内容:
本文分别介绍了通过C语言编写一些实用工具,获取网络相关信息的实现方法。包括获取指定域名的IP地址、本机网络接口的MAC地址以及本机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地址;如果失败则返回错误代码。
想要获取本机特定网络接口的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地址),然后将其格式化为十六进制字符串输出。
要获取本机网络接口的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地址),然后将其格式化为可读字符串。
在使用`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个字节,并将它们转换为十六进制字符串形式。
在某些场景下,可能需要将一个char数组的值赋值给另一个char数组中的指定位置。可以使用`memcpy`函数来实现:
memcpy(chrUDP + 20, mac, 6);
上述代码将`mac`数组的所有值赋值给`chrUDP`数组从位置20开始的后面6个数组元素中。
转载地址:http://rvokk.baihongyu.com/