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

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

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

本文将介绍如何使用C语言编写一个程序来显示计算机的主机名和IP地址。

获取主机名

获取主机名可以使用以下系统调用:

#include <unistd.h>
#include <limits.h>

int gethostname(char *name, size_t len);

该函数有两个参数:

  • name:用于存储主机名的缓冲区。
  • len:缓冲区的大小。

调用成功后,name缓冲区中将包含主机名,len将被设置为主机名的字符串长度。

以下是显示主机名的示例代码:

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

int main()
{
    char hostname[HOST_NAME_MAX + 1] = {0};
    if (gethostname(hostname, HOST_NAME_MAX) == 0)
    {
        printf("Hostname: %s\n", hostname);
    }
    else
    {
        perror("gethostname");
        return 1;
    }
    return 0;
}
获取IP地址

获取IP地址可以使用以下系统调用:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int inet_pton(int af, const char *src, void *dst);

该函数有三个参数:

  • af:地址族。可以是AF_INET(IPv4)或AF_INET6(IPv6)。
  • src:源字符串,是以点分十进制表示的IP地址字符串。
  • dst:用于存储IP地址二进制数据的缓冲区。

调用成功后,dst缓冲区中将包含IP地址的二进制数据。

以下是显示IP地址的示例代码:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>

int main()
{
    char ip[INET_ADDRSTRLEN];
    struct sockaddr_in addr;
    socklen_t len = sizeof(addr);

    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock < 0)
    {
        perror("socket");
        return 1;
    }

    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(0);

    if (bind(sock, (struct sockaddr *)&addr, len) < 0)
    {
        perror("bind");
        return 1;
    }

    if (getsockname(sock, (struct sockaddr *)&addr, &len) < 0)
    {
        perror("getsockname");
        return 1;
    }

    if (inet_ntop(AF_INET, &addr.sin_addr, ip, INET_ADDRSTRLEN) == NULL)
    {
        perror("inet_ntop");
        return 1;
    }

    printf("IP address: %s\n", ip);

    close(sock);
    return 0;
}
完整示例代码

将获取主机名和IP地址的代码组合起来,可以得到一个完整的示例程序:

#include <unistd.h>
#include <limits.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>

int main()
{
    char hostname[HOST_NAME_MAX + 1] = {0};
    if (gethostname(hostname, HOST_NAME_MAX) == 0)
    {
        printf("Hostname: %s\n", hostname);
    }
    else
    {
        perror("gethostname");
        return 1;
    }

    char ip[INET_ADDRSTRLEN];
    struct sockaddr_in addr;
    socklen_t len = sizeof(addr);

    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock < 0)
    {
        perror("socket");
        return 1;
    }

    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(0);

    if (bind(sock, (struct sockaddr *)&addr, len) < 0)
    {
        perror("bind");
        return 1;
    }

    if (getsockname(sock, (struct sockaddr *)&addr, &len) < 0)
    {
        perror("getsockname");
        return 1;
    }

    if (inet_ntop(AF_INET, &addr.sin_addr, ip, INET_ADDRSTRLEN) == NULL)
    {
        perror("inet_ntop");
        return 1;
    }

    printf("IP address: %s\n", ip);

    close(sock);
    return 0;
}

以上就是使用C程序显示主机名和IP地址的方法。您可以根据需要自行修改代码,并运行程序查看输出结果。