📅  最后修改于: 2023-12-03 14:40:26.776000             🧑  作者: Mango
本文将介绍如何使用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地址可以使用以下系统调用:
#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地址的方法。您可以根据需要自行修改代码,并运行程序查看输出结果。