为什么GetHostByName总是阻塞的
1个回答
2016-07-22
展开全部
一、方法分析
在Linux环境下gethostbyname函数是用来向DNS查询一个域名的IP地址。 由于DNS的查询方式是递归查询,在网络不通的情况下会导致gethostbyname函数在查询一个域名时出现严重超时问题。而该函数又不能像connect和read等函数那样通过setsockopt或者select函数那样设置超时时间,因此常常成为程序开发的瓶颈。
在多线程环境下,gethostbyname会出现一个非常严重的问题,就是如果有一个线程的gethostbyname发生阻塞,其它线程都会在gethostbyname处发生阻塞,直到该线程的gethostbyname函数返回为止。针对这样的问题我们应该怎么处理呢?
下面介绍两种方法:
1、 使用alarm设定信号,如果超时就用sigsetjmp和siglongjmp跳过gethostbyname函数。
2、 独立开启一个线程来调用gethostbyname函数,该线程除了调用此函数外,不做任何事情。
二、方法介绍
1、alarm设定信号方法
(1)、sigsetjmp和siglongjmp概述
sigsetjmp: 参数为非0的时候,会保存进程的当前信号屏蔽字
siglongjmp: 恢复保存的信号屏蔽字
(2)、使用方法
#include <setjmp.h>
#include <time.h>
static sigjmp_buf jmpbuf;
static void alarm_func()
{
siglongjmp(jmpbuf, 1);
}
static struct hostent *gngethostbyname(char *HostName, int timeout)
{
struct hostent *lpHostEnt;
signal(SIGALRM, alarm_func);
if(sigsetjmp(jmpbuf, 1) != 0)
{
alarm(0); /* 取消闹钟 */
signal(SIGALRM, SIG_IGN);
return NULL;
}
alarm(timeout); /* 设置超时时间 */
lpHostEnt = gethostbyname(HostName);
signal(SIGALRM, SIG_IGN);
return lpHostEnt;
}
在Linux环境下gethostbyname函数是用来向DNS查询一个域名的IP地址。 由于DNS的查询方式是递归查询,在网络不通的情况下会导致gethostbyname函数在查询一个域名时出现严重超时问题。而该函数又不能像connect和read等函数那样通过setsockopt或者select函数那样设置超时时间,因此常常成为程序开发的瓶颈。
在多线程环境下,gethostbyname会出现一个非常严重的问题,就是如果有一个线程的gethostbyname发生阻塞,其它线程都会在gethostbyname处发生阻塞,直到该线程的gethostbyname函数返回为止。针对这样的问题我们应该怎么处理呢?
下面介绍两种方法:
1、 使用alarm设定信号,如果超时就用sigsetjmp和siglongjmp跳过gethostbyname函数。
2、 独立开启一个线程来调用gethostbyname函数,该线程除了调用此函数外,不做任何事情。
二、方法介绍
1、alarm设定信号方法
(1)、sigsetjmp和siglongjmp概述
sigsetjmp: 参数为非0的时候,会保存进程的当前信号屏蔽字
siglongjmp: 恢复保存的信号屏蔽字
(2)、使用方法
#include <setjmp.h>
#include <time.h>
static sigjmp_buf jmpbuf;
static void alarm_func()
{
siglongjmp(jmpbuf, 1);
}
static struct hostent *gngethostbyname(char *HostName, int timeout)
{
struct hostent *lpHostEnt;
signal(SIGALRM, alarm_func);
if(sigsetjmp(jmpbuf, 1) != 0)
{
alarm(0); /* 取消闹钟 */
signal(SIGALRM, SIG_IGN);
return NULL;
}
alarm(timeout); /* 设置超时时间 */
lpHostEnt = gethostbyname(HostName);
signal(SIGALRM, SIG_IGN);
return lpHostEnt;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询