📜  C程序显示主机名和IP地址(1)

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

C程序显示主机名和IP地址

在网络编程中,经常需要获取主机名和IP地址。C语言提供了一些接口可以用来实现这个功能。

获取主机名

使用 gethostname 函数可以获取主机名。该函数原型如下:

#include <unistd.h>

int gethostname(char *name, size_t len);

该函数的第一个参数是一个指向字符数组的指针,用于保存主机名。第二个参数是主机名字符串的长度。函数执行成功时返回0,失败时返回-1,并设置 errno 变量。

下面是获取主机名的示例代码:

#include <stdio.h>
#include <unistd.h>

int main() {
    char hostname[256];

    if (gethostname(hostname, sizeof(hostname)) == 0) {
        printf("Hostname: %s\n", hostname);
    } else {
        perror("gethostname");
        return 1;
    }

    return 0;
}

上述代码中,我们首先定义了一个长度为 256 的字符数组 hostname,用于保存主机名。然后调用 gethostname 函数来获取主机名,并将结果保存在 hostname 中。如果函数执行成功,则打印出主机名,否则打印出错误信息。

获取IP地址

使用 getaddrinfo 函数可以获取指定主机名的IP地址。该函数原型如下:

#include <netdb.h>

int getaddrinfo(const char *node, const char *service,
                const struct addrinfo *hints, struct addrinfo **res);

该函数的第一个参数是要解析的主机名。第二个参数是服务名或端口号。第三个参数是一个 addrinfo 结构体,用于指定一些标志和选项。第四个参数是一个指向结果链表头部的指针。函数执行成功时返回0,失败时返回非0值。

下面是获取指定主机名的IP地址的示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <arpa/inet.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        fprintf(stderr, "Usage: %s <hostname>\n", argv[0]);
        return 1;
    }

    // 准备地址结构体
    struct addrinfo hints = {0};
    hints.ai_family = AF_INET;  // IPv4
    hints.ai_socktype = SOCK_STREAM;  // TCP

    // 解析主机名
    struct addrinfo *res;
    if (getaddrinfo(argv[1], NULL, &hints, &res) != 0) {
        perror("getaddrinfo");
        return 1;
    }

    for (struct addrinfo *p = res; p != NULL; p = p->ai_next) {
        // 将 IP 地址转换成字符串
        char addr_str[INET_ADDRSTRLEN];
        inet_ntop(p->ai_family, &((struct sockaddr_in *)p->ai_addr)->sin_addr, addr_str, sizeof(addr_str));
        printf("%s\n", addr_str);
    }

    // 释放结果链表
    freeaddrinfo(res);

    return 0;
}

上述代码中,我们首先检查命令行参数是否足够,并打印出使用帮助信息。然后准备 addrinfo 结构体,并指定 IPv4 和 TCP。接下来,调用 getaddrinfo 函数来解析主机名,获取结果链表的头部指针。

在处理链表的每个节点时,我们调用 inet_ntop 函数将 IP 地址转换成字符串,并打印出来。

最后,我们释放结果链表的内存空间。

总结

本文介绍了如何在 C 语言中获取主机名和 IP 地址。这对于网络编程和系统管理都是非常有用的技能。