函数监测http请求超时"/>
使用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;}elsehost = 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[
更多推荐
使用select函数监测http请求超时
发布评论