getaddrinfo 获取地址信息(C语言函数库/CRT)

getaddrinfo 是POSIX定义的通用函数,该函数可以在 Windows、MacOS X、Linux、Android 等平台正确编译且工作。

getaddrinfo 函数的作用为:解释域/IP的地址信息,可简易理解为DNS解析函数。

        static IPEndPoint Ipep_GetEndPointWithNative(const ppp::string& host, int port) noexcept {
            struct addrinfo req, * hints, * p;
            memset(&req, 0, sizeof(req));

            req.ai_family = AF_UNSPEC;
            req.ai_socktype = SOCK_STREAM;

            if (getaddrinfo(host.data(), NULL, &req, &hints)) {
                return IPEndPoint(IPEndPoint::AnyAddress, port);
            }

            for (p = hints; NULL != p; p = p->ai_next) {
                if (p->ai_family == AF_INET) {
                    struct sockaddr_in* ipv4 = (struct sockaddr_in*)p->ai_addr;
                    return IPEndPoint(AddressFamily::InterNetwork,
                        (Byte*)&(ipv4->sin_addr), sizeof(ipv4->sin_addr), port);
                }
            }

            for (p = hints; NULL != p; p = p->ai_next) {
                if (p->ai_family == AF_INET6) {
                    struct sockaddr_in6* ipv6 = (struct sockaddr_in6*)p->ai_addr;
                    return IPEndPoint(AddressFamily::InterNetworkV6,
                        (Byte*)&(ipv6->sin6_addr), sizeof(ipv6->sin6_addr), port);
                }
            }

            return IPEndPoint(IPEndPoint::AnyAddress, port);
        }

潜在风险:

在 Android 平台上,不建议大家在 C++ 上调用该函数解析DNS信息,但 C 语言是可行的,或 C/C++ 调用方层级不多且代码并不复杂,如调用方存在大量的 STL 字符串或容器计算,则不建议大家在安卓上使用它。

这是原因,在这类的场景下,它可能导致程序运行时无意义崩溃,在非 Android 平台上面则无所谓。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值