c语言gethostbyname,实现超时返回的gethostbyname函数

本文介绍了一种在单进程环境中如何使用gethostbyname函数并进行超时控制的方法。通过设置SIGALRM信号和使用sigsetjmp/siglongjmp实现函数调用的中断,当超过指定时间限制,函数将返回空指针。示例代码展示了如何在10秒内获取域名的IP地址,若超时则提示网络错误。这种方法有助于在网络API可能阻塞时避免程序长时间等待。
摘要由CSDN通过智能技术生成

当我们的程序是单进程的时候,居如connect、read、accept、gethostbyname之类的网络API

这里我们使用的办法是设置一个时钟,如果gethostbyname在指定的时间内尚未返回,时钟会强制其返回,得到的返回值显然是空指针,等价于告诉用户主机未连如互联网或者该域名无法解析。为了实现这一功能,我们需要重新封装一个形如gethostbyname的函数来获取

#include

#include

static sigjmp_buf jmpbuf;

static void alarm_func()

{

siglongjmp(jmpbuf, 1);

}

static struct hostent *timeGethostbyname(const char *domain, int timeout)

{

struct hostent *ipHostent = NULL;

signal(SIGALRM, alarm_func);

if(sigsetjmp(jmpbuf, 1) != 0)

{

alarm(0);//timout

signal(SIGALRM, SIG_IGN);

return NULL;

}

alarm(timeout);//setting alarm

ipHostent = gethostbyname(domain);

signal(SIGALRM, SIG_IGN);

return ipHostent;

}

int getIPbyDomain(const char* domain, char* ip)

{

struct hostent *answer;

answer = timeGethostbyname(domain, 10);

if (NULL == answer)

{

herror("gethostbyname");//the error function of itself

return -1;

}

if (answer->h_addr_list[0])

inet_ntop(AF_INET, (answer->h_addr_list)[0], ip, 16);

else

return -1;

return 0;

}

这样,如果我们想获得域名”www.cpplive.com” 所指向的IP地址,且要求在3秒内返回结果,则可以调用如下语句实现:

char cppliveIP[32];

char cpplive[32] = {"www.cpplive.com"};

if (getIPbyDomain(cpplive, cppliveIP))

printf("The domain not exist or the network disconnected!\n");

else

printf("The IP of %s is %s\n", cpplive, cppliveIP);

除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值