c获取主机ip

获取主机IP,可以使用多种方法。在Windows系统中,可以通过命令提示符输入ipconfig命令查看。在Linux系统中,可以使用ifconfigip addr命令。

在C语言中获取主机IP地址是一个常见的需求,尤其是在网络编程和系统管理等领域,下面将介绍几种常用的方法来获取主机的IP地址,并提供相应的代码示例。

c获取主机ip

方法一:使用gethostnamegethostbyname函数

1、原理:首先通过gethostname函数获取本地计算机的主机名,然后使用gethostbyname函数根据主机名获取主机信息,其中包含了IP地址。

2、代码示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#include <arpa/inet.h>
int main() {
    char hostname[1024];
    struct hostent host;
    struct in_addr addr_list;
    if (gethostname(hostname, sizeof(hostname)) == -1) {
        perror("gethostname");
        exit(1);
    }
    host = gethostbyname(hostname);
    if (host == NULL) {
        fprintf(stderr, "No such host
");
        exit(1);
    }
    addr_list = (struct in_addr )host->h_addr_list;
    for(int i = 0; addr_list[i] != NULL; i++) {
        printf("IP Address %d: %s
", i + 1, inet_ntoa(addr_list[i]));
    }
    return 0;
}

3、注意事项

gethostbyname函数在某些系统中可能已被弃用,建议使用getaddrinfo替代。

该方法只能获取本机的IPv4地址,对于IPv6地址需要其他方法。

方法二:使用`getifaddrs`函数

1、原理getifaddrs函数可以获取所有网络接口的信息,包括IPv4和IPv6地址,通过遍历这些接口信息,可以找到所需的IP地址。

2、代码示例

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main() {
    struct ifaddrs ifaddr, ifa;
    int family, s;
    char host[NI_MAXHOST];
    if (getifaddrs(&ifaddr) == -1) {
        perror("getifaddrs");
        exit(EXIT_FAILURE);
    }
    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
        if (ifa->ifa_addr == NULL)
            continue;
        family = ifa->ifa_addr->sa_family;
        if (family == AF_INET || family == AF_INET6) {
            s = getnameinfo(ifa->ifa_addr,
                            (family == AF_INET) ? sizeof(struct sockaddr_in) :
                                                  sizeof(struct sockaddr_in6),
                            host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
            if (s != 0) {
                printf("getnameinfo() failed: %s
", gai_strerror(s));
                exit(EXIT_FAILURE);
            }
            printf("%s address: <%s>
", (family == AF_INET) ? "IPv4" : "IPv6", host);
        }
    }
    freeifaddrs(ifaddr);
    exit(EXIT_SUCCESS);
}

3、注意事项

c获取主机ip

该方法可以同时获取IPv4和IPv6地址,适用于需要处理多种地址类型的场景。

需要包含<ifaddrs.h>头文件,并在编译时链接相应的库(如在Linux下可能需要链接-lnet)。

方法三:使用socket编程结合ioctl系统调用

1、原理:创建一个原始套接字,然后使用ioctl系统调用获取网络接口的信息,从中提取IP地址。

2、代码示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <unistd.h>
int main() {
    int fd;
    struct ifreq ifr;
    char iface = "eth0"; // 指定网络接口名称,根据实际情况修改
    unsigned char mac;
    fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (fd < 0) {
        perror("socket");
        exit(1);
    }
    strncpy(ifr.ifr_name, iface, IFNAMSIZ-1);
    ifr.ifr_name[IFNAMSIZ-1] = '