📅  最后修改于: 2023-12-03 14:53:13.647000             🧑  作者: Mango
在进行网络编程或网络调试时,我们通常需要知道本机的 IP 地址。IP 地址是 Internet Protocol 的缩写,是用于在计算机网络上定位和寻址的唯一标识。本文将介绍如何使用 C 语言编写程序,以获取本机的 IP 地址。
在 Windows 系统中,可以使用系统函数 GetAdaptersAddresses()
获取本机的 IP 地址。该函数需要包含头文件 iphlpapi.h
和 winsock2.h
。
函数原型如下:
ULONG GetAdaptersAddresses(
ULONG Family,
ULONG Flags,
PVOID Reserved,
PIP_ADAPTER_ADDRESSES AdapterAddresses,
PULONG SizePointer
);
其中 AdapterAddresses
参数需要传递一个指向 IP_ADAPTER_ADDRESSES
的结构体指针,用于存储获取到的网卡信息。SizePointer
参数表示 AdapterAddresses
指向的缓冲区大小,如果传递的空间太小,则函数将返回一个错误码 ERROR_BUFFER_OVERFLOW
,并将 SizePointer
设为所需大小。
以下是获取本机 IP 地址的示例代码:
#include <iphlpapi.h>
#include <winsock2.h>
int main()
{
PIP_ADAPTER_ADDRESSES pAddresses = NULL;
ULONG outBufLen = 0;
ULONG flags = GAA_FLAG_INCLUDE_PREFIX;
DWORD ret;
// 获取需要的缓冲区大小
ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, NULL, &outBufLen);
if (ret == ERROR_BUFFER_OVERFLOW) {
pAddresses = malloc(outBufLen);
} else {
return 1;
}
// 获取网络接口信息
ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, pAddresses, &outBufLen);
if (ret == NO_ERROR) {
// 遍历所有网卡
for (PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses; pCurrAddresses != NULL; pCurrAddresses = pCurrAddresses->Next) {
// 遍历所有 IP 地址
for (PIP_ADAPTER_UNICAST_ADDRESS pUnicast = pCurrAddresses->FirstUnicastAddress; pUnicast != NULL; pUnicast = pUnicast->Next) {
// 获取 IP 地址的字符串形式
char ipstr[INET6_ADDRSTRLEN];
void* sin_addr_ptr = &(pUnicast->Address.lpSockaddr->sa_data[sizeof(unsigned short)]);
inet_ntop(pUnicast->Address.lpSockaddr->sa_family, sin_addr_ptr, ipstr, sizeof(ipstr));
printf("IP address: %s\n", ipstr);
}
}
}
// 释放内存
free(pAddresses);
return 0;
}
在 Linux 系统中,可以通过解析文件 /proc/net/if_inet6
获取本机的 IPv6 地址。该文件包含了网络接口的 IPv6 地址和其他相关信息。
以下是获取本机 IPv6 地址的示例代码:
#include <stdio.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <sys/ioctl.h>
int main()
{
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ - 1); // 替换为实际的网络接口名称
int fd = socket(AF_INET6, SOCK_DGRAM, 0);
if (fd < 0) {
return 1;
}
if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) {
close(fd);
return 1;
}
char ipstr[INET6_ADDRSTRLEN];
struct sockaddr_in6* addr = (struct sockaddr_in6*)&ifr.ifr_addr;
inet_ntop(AF_INET6, &addr->sin6_addr, ipstr, sizeof(ipstr));
printf("IPv6 address: %s\n", ipstr);
close(fd);
return 0;
}
本文介绍了如何使用 C 语言编写程序,以获取本机的 IP 地址。在 Windows 系统中,可以使用系统函数 GetAdaptersAddresses()
获取本机 IP 地址;在 Linux 系统中,可以通过解析文件 /proc/net/if_inet6
获取本机 IPv6 地址。