📅  最后修改于: 2023-12-03 15:14:26.299000             🧑  作者: Mango
在网络编程中,经常需要获取主机名和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
中。如果函数执行成功,则打印出主机名,否则打印出错误信息。
使用 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 地址。这对于网络编程和系统管理都是非常有用的技能。