Cómo configurar el tiempo de espera de gethostbyname
1. Análisis del método
En el entorno Linux, la función gethostbyname se utiliza para consultar al DNS la dirección IP de un nombre de dominio. Dado que el método de consulta DNS es recursivo, cuando la red no está disponible, la función gethostbyname tendrá un grave problema de tiempo de espera al consultar un nombre de dominio. Y esta función no puede establecer el tiempo de espera a través de setsockopt o seleccionar funciones como conectar y leer, por lo que a menudo se convierte en un cuello de botella en el desarrollo de programas.
En un entorno de subprocesos múltiples, surgirá un problema muy grave con gethostbyname, es decir, si se bloquea gethostbyname de un subproceso, otros subprocesos se bloquearán en gethostbyname hasta que regrese la función gethostbyname del subproceso. ¿Cómo deberíamos afrontar semejante problema?
A continuación se presentan dos métodos:
1. Utilice la alarma para configurar la señal. Si se agota el tiempo de espera, utilice sigsetjmp y siglongjmp para omitir la función gethostbyname.
2. Inicie un hilo de forma independiente para llamar a la función gethostbyname. El hilo no hace nada excepto llamar a esta función.
2. Introducción al método
1. Método de configuración de la señal de alarma
(1) Descripción general de sigsetjmp y siglongjmp
sigsetjmp: parámetros Cuándo si no es 0, se guardará la palabra de máscara de señal actual del proceso
siglongjmp: restaurar la palabra de máscara de señal guardada
(2), método de uso
# include
#include
static sigjmp_buf jmpbuf;
static void alarm_func()
{
siglongjmp(jmpbuf, 1);
}
estructura estática hostent *gngethostbyname(char *HostName, int timeout)
{
estructura hostent *lpHostEnt;
señal(SIGALRM, alarm_func);
if(sigsetjmp(jmpbuf, 1) != 0)
{
alarma(0); /* Cancelar alarma*/
señal(SIGALRM, SIG_IGN);
return NULL;
}
alarm(timeout); /* Establecer tiempo de espera*/
lpHostEnt = gethostbyname(HostName);
signal(SIGALRM , SIG_IGN) ;
devuelve lpHostEnt;
}