使用select函数监测http请求超时

人生如逆旅

我亦是行人

最近研究怎么实现HTTP请求超时检测并踢掉请求的功能。

一开始想到用linux的信号机制,可是用了感觉问题挺多的,好多时候不生效,要么就是不能一个进程里重复用。

然后就在博客上找,基本都是说select的,索性我就两个都用了,DNS请求用信号,TCP连接和HTTP请求用seletct。

一般我们用select都是在用到多路复用的情况下,也就是委托系统内核帮我们先检测一下这一堆IO中是否有事件,而不是程序员开发个轮询非阻塞的东西去试探,当然select也需要开发程序去轮询,但起码知道一定有事件了。

这次实现检测HTTP请求响应也是同理,当select提醒了再去读不就行了吗,既可以设置超时而且还不用设置成非阻塞,实在简单方便呀。

利用自己开发的一些HTTP请求库实现了一个简单的例子:

DNS请求超时

DNS请求超时控制:

std::string get_host(std::string name) {
   
    struct hostent *addr = nullptr;
    std::string host;
    tmp = "Connect the DNS server time out, please check your url and network!(%d)";
    signal(SIGALRM, alarmhandle);
    alarm(5);
    addr = gethostbyname(name.c_str());
    alarm(0);
    sigrelse(SIGALRM);
    // 如果是网络问题,这里会返回空指针
    if (!addr) {
   
        std::cerr << "Can't connect the DNS, please check your url and network!" << std::endl;
        bbkgl::error_num = DNSERROR;
    }
    else
        host = std::string(inet_ntoa(*(struct in_addr *)addr->h_addr_list[0]));
    return host;
}

样例程序:

#include <map>
#include <cstdio>
#include "crequests.h"

int main() {
   
    std::map<std::string, std::string> headers;
    headers[
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值