📜  如何知道我的 p 的 ip 地址 - C 编程语言(1)

📅  最后修改于: 2023-12-03 14:53:13.647000             🧑  作者: Mango

如何知道我的 P 的 IP 地址?

介绍

在进行网络编程或网络调试时,我们通常需要知道本机的 IP 地址。IP 地址是 Internet Protocol 的缩写,是用于在计算机网络上定位和寻址的唯一标识。本文将介绍如何使用 C 语言编写程序,以获取本机的 IP 地址。

实现
Windows 系统

在 Windows 系统中,可以使用系统函数 GetAdaptersAddresses() 获取本机的 IP 地址。该函数需要包含头文件 iphlpapi.hwinsock2.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 系统

在 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 地址。