使用windows socket进行域名解析

  使用windows socket域名解析主要用到了两个函数:gethostbyname()和inet_ntoa(),其中struct hostent *gethostbyname(const char *name)函数返回对应于给定主机名的包含主机名字和地址信息的hostent结构的指针,参数name需要填入域名;char *inet_ntoa(struct in_addr in);将一个32位网络字节序的二进制IP地址转换成相应的点分十进制的IP地址(返回点分十进制的字符串在静态内存中的指针)。

  下面的程序演示解析百度的域名:

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <iostream>

#pragma comment(lib,"ws2_32.lib")
using namespace std;
bool Dns(char *domain)
{
    hostent *hostEntry = NULL;
    char **ppAlias = NULL; // 主机别名
    char **ppAddr = NULL; // 点分十进制ip地址
    sockaddr_in sin;
    WORD sockVersion = MAKEWORD(2, 2);
    WSADATA wsaData;
    if (WSAStartup(sockVersion, &wsaData) != 0) {
        return false;
    }
    hostEntry = gethostbyname(domain);
    if (hostEntry == NULL) {
        cout << "get host by name failed!\n";
        return false;
    }

    cout << hostEntry->h_name << endl; // 主机名
    // 主机别名
    for (ppAlias = hostEntry->h_aliases; *ppAlias != NULL; ++ppAlias) {
        cout << *ppAlias << endl;
    }
    // 解析出的ip
    for (ppAddr = hostEntry->h_addr_list; *ppAddr != NULL; ++ppAddr) {
        memcpy(&sin.sin_addr, *ppAddr, sizeof(*ppAddr));
        cout << inet_ntoa(sin.sin_addr) << endl;
    }

    return true;
}

int main(int argc, char* argv[])
{
    char ip[256] = "www.baidu.com";
    Dns(ip);
    return 0;
}

解析结果:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值