ZBLOG

getifaddrs除了此方法还有其他方法获取本机ip

除了使用 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. 使用 ioctlSIOCGIFADDR

可以通过套接字和 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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=6477

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?