为什么GetHostByName总是阻塞的

 我来答
匿名用户
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;

}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式