除了使用 getifaddrs
函数外,还有其他几种方法可以在 C/C++ 程序中获取本机 IP 地址。以下是一些常见的方法:
1. 使用 gethostbyname
这种方法通过主机名获取 IP 地址,通常用于获取本地机器的地址。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <netdb.h>
int main() {
struct hostent *host;
char hostname[1024];
// 获取本地主机名
gethostname(hostname, sizeof(hostname));
// 根据主机名获取信息
host = gethostbyname(hostname);
if (host == NULL) {
herror("gethostbyname");
return EXIT_FAILURE;
}
// 打印所有地址
for (char **addr = host->h_addr_list; *addr != NULL; addr++) {
struct in_addr addr_in;
memcpy(&addr_in, *addr, sizeof(struct in_addr));
printf("IP Address: %s\n", inet_ntoa(addr_in));
}
return EXIT_SUCCESS;
}
2. 使用 ioctl
和 SIOCGIFADDR
可以通过套接字和 ioctl 调用来获取接口的 IP 地址。这种方法需要更低层次的访问。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netinet/in.h>
#include <net/if.h>
int main() {
int sockfd;
struct ifreq ifr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
// 指定要查询的接口(如 "eth0")
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
if (ioctl(sockfd, SIOCGIFADDR, &ifr) == -1) {
perror("ioctl");
close(sockfd);
return EXIT_FAILURE;
}
close(sockfd);
struct sockaddr_in *addr = (struct sockaddr_in *)&ifr.ifr_addr;
printf("IP Address: %s\n", inet_ntoa(addr->sin_addr));
return EXIT_SUCCESS;
}
3. 使用 getnameinfo
此函数可以将网络地址转换为人类可读的字符串格式,并且支持 IPv4 和 IPv6。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
int main() {
char host[NI_MAXHOST], service[NI_MAXSERV];
struct sockaddr_storage addr;
// 在这里手动设置一个 sockaddr_storage 对象,通常会从其他地方获得。
// 本示例假设已经填充了 addr 结构,比如来自 accept() 或 recvfrom()
// 示例:以 localhost 的 IPv4 地址为例
memset(&addr, 0, sizeof(addr));
((struct sockaddr_in*)&addr)->sin_family = AF_INET;
((struct sockaddr_in*)&addr)->sin_port = htons(80);
inet_pton(AF_INET, "127.0.0.1", &((struct sockaddr_in*)&addr)->sin_addr);
int result = getnameinfo((struct sockaddr *)&addr,
sizeof(addr),
host, sizeof(host),
service, sizeof(service),
NI_NUMERICHOST);
if (result != 0) {
fprintf(stderr, "getnameinfo: %s\n", gai_strerror(result));
return EXIT_FAILURE;
}
printf("IP Address: %s\n", host);
return EXIT_SUCCESS;
}
总结
以上就是几种在 C/C++ 中获取本机 IP 地址的方法,每种方法都有其特定的适用场景。根据您的需求选择合适的方法进行实现。
内容由零声教学AI助手提供,问题来源于学员提问