C/C++ obtiene la dirección IP real del servidor a través del nombre de dominio

Índice de contenidos de los artículos de la serie.



Insertar descripción de la imagen aquí

prefacio

En el proyecto real, Tcp se utiliza para conectarse al servidor. Teniendo en cuenta que el servidor puede proporcionar una dirección IP o un nombre de dominio, estudiamos cómo obtener la dirección IP real del nombre de dominio.


1. obtenerhostbyname

La función gethostbyname se utiliza principalmente . Déjame explicarte primero:

1. Archivos de encabezado y prototipos de funciones.

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

2. Función

Se utiliza para devolver la información del host correspondiente al nombre de host dado.

3. Valor de retorno

Valor de retorno estructura hostent:

/* Description of data base entry for a single host.  */
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 from name server.  */
#ifdef __USE_MISC
# define	h_addr	h_addr_list[0] /* Address, for backward compatibility.*/
#endif
};

Como se puede ver en la estructura, no solo devuelve la dirección IP, sino que también devuelve otra información, que es la siguiente: h_name
: esta variable almacena el nombre de dominio oficial, que representa una determinada página de inicio, pero de hecho, los nombres de dominio. Algunas empresas famosas no están registradas con un nombre de dominio oficial.
h_aliases : Se puede acceder a la misma página de inicio a través de varios nombres de dominio y la misma IP se puede vincular a varios nombres de dominio, por lo que, además del nombre de dominio oficial, se pueden especificar otros nombres de dominio.
h_addrtype : la función gethostbyname no solo admite IPv4, sino que también admite IPv6. Por lo tanto, la información de la familia de direcciones de la dirección IP almacenada en h_addr_list se puede obtener a través de esta variable. Si es IPv4, esta variable contiene AF_INET.
h_length : guarda la longitud de la dirección IP. Si es una dirección IPv4, por ser 4 bytes, se guardan 4; si es IPv6, por ser 16 bytes, se guardan 16.
h_addr_list : esta variable almacena la dirección IP del nombre de dominio en forma de número entero. Además, los sitios web con una gran cantidad de visitas pueden asignar varias IP al mismo nombre de dominio y utilizar varios servidores para equilibrar la carga. También puede obtener información de la dirección IP a través de esta variable.
h_addr : esta variable es el primer dato en la lista h_addr_list devuelta.

2. Función de encapsulación para obtener IP

#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
/**
 * @brief 判断传入的是域名还是ip地址,如果是域名,就通过域名获取ip地址,如果是ip地址不处理,直接返回 
 * @param host : 域名或IP地址
 * @return std::string 获取成功返回IP地址,失败返回空
 */
static std::string _GetServerIP(char *host)
{
    
    
    if (host == NULL)
    {
    
    
        return std::string();
    }

    struct hostent *pstHostent = NULL;
    if (inet_addr(host) == INADDR_NONE)
    {
    
    
        if ((pstHostent = gethostbyname(host)) == NULL)
        {
    
    
            return std::string();
        }
        char *ipaddr = inet_ntoa(*(struct in_addr *)pstHostent->h_addr);
        if (ipaddr)
        {
    
    
            return std::string(ipaddr);
        }
    }
    else
    {
    
    
        return std::string(host);
    }
    return std::string();
}

3. Ejemplos

#include <arpa/inet.h>
#include <vector>
int main(int argc, char *argv[])
{
    
    

    char host[64] = {
    
    0};
    snprintf(host, sizeof(host), "%s", "www.baidu.com");
    std::string ipaddr = _GetServerIP(host);
    printf("ipaddr:%s\n", ipaddr.c_str());
    return 0;
}

Resultado de ejecución: ipaddr:110.242.68.3

4. Resumen

La función encapsulada se puede utilizar directamente y ha sido verificada.

Supongo que te gusta

Origin blog.csdn.net/weixin_37926485/article/details/127665234
Recomendado
Clasificación