IT袋

当前位置:主页 > 经验教程 > 建站编程 >

域名解析API介绍

域名解析API介绍 深入了解域名解析API

时间:2024-01-09 15:57:48 来源:IT袋 作者:马勇
导读:域名解析API介绍,为网友解答域名解析API介绍方面的讲解,具体介绍如下: 为了便于记忆,有时候我们需要我们的程序可以使用域名和端口号去连接服务,这种情况下,我们需要使用 soc

域名解析API介绍

为网友解答域名解析API介绍方面的讲解,具体介绍如下:

为了便于记忆,有时候我们需要我们的程序可以使用域名和端口号去连接服务,这种情况下,我们需要使用 socket API gethostbyname 函数先把域名转换成 ip 地址,再使用 connect函数连接。

域名解析API介绍

在Linux系统上, gethostbyname函数的签名如下:

#include <netdb.h>
       
struct hostent* gethostbyname(const char* name);

域名转换成 ip 时,转换结果存在一个 hostent 结构体中。

转换成功后的 ip 地址存放在 hostent 最后一个字段中,hostent 结构体类型定义如下:

struct hostent 
{
    char*  h_name;            /* official name of host */
    char** h_aliases;         /* alias list */
    int    h_addrtype;        /* host address type */
    int    h_length;          /* length of address */
    char** h_addr_list;       /* list of addresses */
}
#define h_addr h_addr_list[0] /* for backward compatibility */
  • 字段h_name:地址的正式名称;
  • 字段h_aliases:地址的预备名称指针;
  • 字段h_addrtype:地址类型,通常是AF_INET;
  • 字段h_length:地址的长度,以字节数目为计量单位;
  • 字段h_addr_list:主机网络地址指针,网络字节顺序。其中,h_addr是字段h_addr_list中的第一地址。

注意:虽然h_addr_list[0]看起来是一个char* 类型,但实际上是一个uint32_t,这是 ip 地址的 32 bit 整数表示形式,如果需要转换成十进制点分法字符串再调用 inet_ntoa() 函数即可。

我们来看一段示例代码:

#include <sys/types.h>  
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
//extern int h_errno;
bool connect_to_server(const char* server, short port)
{
    int hSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (hSocket == -1)
        return false;
    struct sockaddr_in addrSrv = { 0 };
    struct hostent* pHostent = NULL;
    //unsigned int addr = 0;
    //如果传入的参数 server 的值是 somesite.com 这种域名域名形式则 if 条件成立,
 //接着调用 gethostbyname 解析域名为 4 字节的 ip 地址(整型)
 if (addrSrv.sin_addr.s_addr = inet_addr(server) == INADDR_NONE)
    {       
  pHostent = gethostbyname(server);
        if (pHostent == NULL)      
            return false;
        
        //当使用 gethostbyname 解析域名时可能会得到多个 ip 地址,一般最常用的使用第一个 ip 地址
        addrSrv.sin_addr.s_addr = *((unsigned long*)pHostent->h_addr_list[0]);
    }
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(port);
    int ret = connect(hSocket, (struct sockaddr*)&addrSrv, sizeof(addrSrv));
    if (ret == -1)
        return false;
    return true;
}
int main()
{
 if (connect_to_server("baidu.com", 80))
  printf("connect successfully.\n");
 else
  printf("connect error.\n");
 
 return 0;
}

相关阅读

  • 如何注册公司网站域名 关于申请建立网站

    如何注册公司网站域名 关于申请建立网站

    今日重点为您介绍如何注册公司网站域名和关于申请建立网站方面的内容,一定能解决您的问题的,一起来了解吧! 很多企业都开始建网站了,但是有很多小企业没有注册过,所以不太明白,

  • 自己制作网站需要多少钱 开网站需要投资的费用

    自己制作网站需要多少钱 开网站需要投资的费用

    今天小编详解自己制作网站需要多少钱和开网站需要投资的费用方面的介绍,接下来IT袋带大家一起了解。 做一个网站,所花的几百块钱,只是一个模板的基础费用,你还要去做一些设置工作

  • 服务器的作用和用途 常见的服务器种类介绍

    服务器的作用和用途 常见的服务器种类介绍

    关于服务器的作用和用途和常见的服务器种类介绍的介绍,相关内容具体如下: 众所周知,机房是服务器托管商的重要资源,选择一家靠谱的服务器托管商就必须要对IDC其机房进行考察和参观

  • 做网站大概要多少钱 网页制作费用了解

    做网站大概要多少钱 网页制作费用了解

    为关注IT袋网的网友们详解做网站大概要多少钱和网页制作费用了解的内容,接下来IT袋带大家一起了解。 着互联网的普及和发展,网站建设已经成为一项必不可少的任务。然而,网站建设费用